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 实体也必须注入依赖项。使用工厂时,存储库也可以使用工厂。
最后,在域服务中注入依赖项并让域服务进行验证也可能更容易。但正如我上面所说:这很容易导致模型贫血,您应该始终尝试防止这种情况发生。
考虑到 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 实体也必须注入依赖项。使用工厂时,存储库也可以使用工厂。
最后,在域服务中注入依赖项并让域服务进行验证也可能更容易。但正如我上面所说:这很容易导致模型贫血,您应该始终尝试防止这种情况发生。