
本教程探讨如何使用 archunit 框架,强制规定仓库(repository)层中的类只能被一个服务(service)层中的类所依赖,从而确保架构的清晰性和模块间的单一职责。文章将通过两种 archunit 规则的实现方式,包括简洁的描述性条件和更灵活的自定义条件,详细演示如何检查并报告违反此单一依赖原则的架构问题。
在软件开发中,清晰的架构和模块间的职责分离至关重要。特别是在分层架构中,如经典的“服务-仓库”模式,我们可能希望强制某些特定的依赖关系。一个常见的需求是:一个数据仓库(Repository)类只能被一个业务服务(Service)类所使用,以避免仓库在多个服务间被不恰当地共享,从而导致职责不清或难以维护。ArchUnit 是一个强大的 Java 架构测试库,能够帮助我们自动化地检查和强制这些架构规则。
确保单一依赖的架构挑战
我们的目标是定义一个 ArchUnit 规则,确保位于特定包(例如 SUBPACKAGE_NAME_REPOSITORY)中的任何仓库类,都只能被一个且仅一个位于特定包(例如 SUBPACKAGE_NAME_SERVICE)中的服务类所依赖。
最初,我们可能会想到使用 onlyHaveDependentClassesThat() 这样的规则来限制依赖者的类型:
import com.tngtech.archunit.lang.ArchRule;
import com.tngtech.archunit.junit.ArchTest; // 或者 org.junit.jupiter.api.Test;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
public class RepositoryServiceRules {
private static final String SUBPACKAGE_NAME_REPOSITORY










