Clean Architecture 和实体的依赖注入

Clean Architecture and entity's dependency injection

考虑到 Clean Architecture 的领域,实体是否可以通过依赖注入接收外部对象以验证其领域?这是可以接受的吗?目前我认为不,因为尽管抽象,它似乎打破了依赖规则。

您可以将验证器注入实体并仍然遵循依赖性规则。你只需要指定一个接口,

public interface OrderValidator {
    public void validate(Order order)
    // maybe more fine grained methods
}

在外层(网关)实现它

public MyOrderValidator implements OrderValidator {
   // ...
}

并将其传递给实体。

public class Order {
  
    public Order(OrderValidator v){
       // save to private field
    }
}

但是 这种设计意味着您将验证逻辑从实体中提取出来,然后将其放在其他地方。这导致 anemic domain model.

通常,域实体包含确保其状态所需的验证规则。

如果您有属于多个实体的验证规则,例如 DDD 中的聚合,您应该使用 domain service。当您想将依赖项注入域实体时,必须在创建实体时注入它。您通常通过简单地调用它们的构造函数来在用例中创建实体。要么用例传递依赖关系,要么您创建一个负责注入依赖关系的工厂。而且存储库 return 实体也必须注入依赖项。使用工厂时,存储库也可以使用工厂。

最后,在域服务中注入依赖项并让域服务进行验证也可能更容易。但正如我上面所说:这很容易导致模型贫血,您应该始终尝试防止这种情况发生。