java - 如何防止某些包在 ArchUnit 中使用 spring?

标签 java spring domain-driven-design hexagonal-architecture archunit

如果我想使某个 Java 包免受 ArchUnit 的第 3 方依赖,我该怎么做?

更具体地说,我正在考虑将我的域模型保持在六边形架构中,不受 Spring 代码的影响。我指定了一些我认为应该阻止模型使用 spring 的规则。但是,我可以使用 @Component@Bean 等 Spring 注释,而不会造成违规。

到目前为止我尝试过的是

layeredArchitecture().
  layer("domain").definedBy(DOMAIN_LAYER).
  layer("application").definedBy(APPLICATION_LAYER).
  layer("primary-adapters").definedBy(PRIMARY_ADAPTERS).
  layer("secondary-adapters").definedBy(SECONDARY_ADAPTERS).
  layer("spring").definedBy("org.springframework..")
  whereLayer("spring").mayOnlyBeAccessedByLayers("primary-adapters", "secondary-adapters", "application").
  because("Domain should be kept spring-free").
  check(CLASSES);

还有

noClasses().that().resideInAPackage(DOMAIN_LAYER).
should().dependOnClassesThat().resideInAPackage("org.springframework..").
check(CLASSES);

noClasses().that().resideInAPackage(DOMAIN_LAYER).
should().accessClassesThat().resideInAPackage("org.springframework..").
check(CLASSES);

Here尽管 com.example.app.domain.Factory 正在导入 org.springframework...,但执行测试效果很好的代码示例。

最佳答案

您可以使用DescribedPredicate:

void domainSpring() {
    DescribedPredicate<JavaAnnotation> springAnnotationPredicate = new DescribedPredicate<JavaAnnotation>("Spring filter") {
        @Override
        public boolean apply(JavaAnnotation input) {
            return input.getType().getPackageName().startsWith("org.springframework");
        }
    };
    classes().that().resideInAPackage(DOMAIN_LAYER).should()
            .notBeAnnotatedWith(springAnnotationPredicate).check(CLASSES);

}

关于java - 如何防止某些包在 ArchUnit 中使用 spring?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53787810/

相关文章:

domain-driven-design - 如何在CQRS中处理摘要/报告?

java - Weka:属性选择期间的监督离散化问题和错误 "Not enough training instances"

java - Applet 连接数据库 JNLP 错误

java - 注册用户后自动登录

c# - DDD - 服务层和存储库之间的重复

c# - CQRS 架构中的域验证

java - 如何随机组合 2 个数组的元素,同时确保在所有元素至少使用一次之前不会重复使用某个元素?

java - 无法解码java中的base64字符串

spring - 来自 Spring JDBCTemplate 查询方法的结果集元数据

spring - Web 应用程序启动警告 :No MyBatis mapper was found in . .. ,请检查您的配置