我有两个包,一个用于接口,一个用于实现。我想将类的访问限制在它们实现的接口上。说:
package com.interfaces
interface AI {
}
package com.interfaces
interface BI {
}
package com.impls
class A implements AI{
}
package com.impls
class B implements BI{
}
我已经有一个规则来确保 com.impls 中的每个类都实现来自 com.interfaces 的接口:
ArchRuleDefinition.classes()
.that().resideInAPackage("com.impls..")
.should().implement(JavaClass.Predicates.resideInAPackage("com.interfaces.."))
现在我需要确保一个类只访问它实现的接口。如果有帮助,我也可以依赖上面示例中的命名约定。我正在寻找类似的东西:
ArchRuleDefinition.classes()
.that().resideInAPackage("com.impls..")
.should().implement(JavaClass.Predicates.resideInAPackage("com.interfaces.."))
.andShould().onlyHaveDependentClassesThat().haveSimpleNameContaining("THE NAME OF THE IMPLEMENTING CLASS")
我们将在任何地方使用接口,并注入实现(Spring Boot)。但是不允许实现访问它没有实现的接口。所以允许 AI 访问 A 但不允许访问 B。允许 BI 访问 B 但不允许访问 A!另一方面,接口不限于实现。它们将用于其他包中。
有没有办法重用规则第一部分的名称或在 ArchUnit 中以另一种方式限制访问?