域层
– 产品
–ProductService(应该进入这个层?)
–IProductService
–IProductRepository
基础设施层
–ProductRepository(在我的域中的IProductRepository的Imp)
现在,当创建新产品时,我需要通过调用ProductService.GetNextProductId()方法来分配产品ID.
因为服务对存储库有依赖关系,所以我设置了一个可以在以后注入的IProductRepository接口的ProductService ctor.这样的:
public class ProductService : IProductService { private IProductRepository _repository; public ProductService(IProductRepository repository) { _repository = repository; } public long GetNextProductId() { return _repository.GetNextProductId(); } }
我的问题是,当我使用产品类中的服务时,我在实例化一个新的ProductService类时引用了ctor中的Repository.在DDD这个大的没有没有这样的参考.我甚至不确定我的产品域类正在正确设置来调用服务,有人可以告诉你:
public class Product : Entity { private ProductService _svc; private IProductRepository _repository; public Product(string name,Address address) //It doesnt seem right to put parm for IProductRepository in the ctor? : base(_svc.GetNextProductId) // This is where i pass the id { // where to create an instance of IProductRepository? } }
我如何优雅地解决这个设计问题?我有经验的DDD’ers的建议
编辑:
感谢您的意见.我也怀疑是否应该从产品类调用该服务.我还没有使用工厂模式(还),因为对象的构造仍然很简单.我不觉得有工厂方法吗?
我很困惑…把ProductId放在一边,如果我的产品类需要一个服务的其他数据,例如GetSystemDateTime()(我知道,不好的例子,但试图演示一个非db调用)这个服务方法在哪里被调用?
DDD中的服务是逻辑转储,其逻辑不属于域对象,对吧?那么它如何粘在一起?
另一个很好的例子,我一直提到的是资金转账的方法.您不会有从一个对象转移到另一个对象的帐户对象,而是您将拥有一个服务,其中包含“到”帐户和“从”帐户.然后在服务内部,您可以使用“从”帐户和您的“到”帐户的存款方式调用提款方式.如果你试图把它放在帐户实体本身,那将会感到尴尬.
一个很好的播客可以在这个专题上进行深入的讨论,可以发现here. David Laribee做了一个非常好的工作,现在只解释了DDD的“如何”,但是“为什么”.