设计模式 – DDD – 域模型,服务和存储库之间的依赖关系

前端之家收集整理的这篇文章主要介绍了设计模式 – DDD – 域模型,服务和存储库之间的依赖关系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
只想知道别人如何分层他们的建筑.说我有我的层如下:

域层
– 产品
–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中的服务是逻辑转储,其逻辑不属于域对象,对吧?那么它如何粘在一起?

到最后一点,DDD中的服务是将我所描述的“尴尬”逻辑的一个地方.如果您有某种类型的逻辑或工作流依赖于其他实体,则这种逻辑类型通常不适合域对象本身.示例:如果我的业务对象上有一个方法来执行某种类型的验证,那么服务类可能会执行此方法(仍然保持与实体在其类内相关的实际验证逻辑)

另一个很好的例子,我一直提到的是资金转账的方法.您不会有从一个对象转移到另一个对象的帐户对象,而是您将拥有一个服务,其中包含“到”帐户和“从”帐户.然后在服务内部,您可以使用“从”帐户和您的“到”帐户的存款方式调用提款方式.如果你试图把它放在帐户实体本身,那将会感到尴尬.

一个很好的播客可以在这个专题上进行深入的讨论,可以发现here. David Laribee做了一个非常好的工作,现在只解释了DDD的“如何”,但是“为什么”.

原文链接:https://www.f2er.com/javaschema/281961.html

猜你在找的设计模式相关文章