如何在洋葱架构上实现服务和存储库?

Sau*_*ory 7 .net domain-driven-design ddd-repositories onion-architecture ddd-service

我一直在研究洋葱建筑学几天.我知道依赖关系应始终走向中心,以及如何使用依赖注入来实现这一目标.但我还有几个问题我仍然无法弄清楚.

  1. 模型(或实体)可以引用存储库接口或服务接口吗?

    例如:Order实体具有DeliveryCity通过Oder.DeliveryZip属性建立的关系,该关系不是外键,而是唯一的.要获得拉链的城市,我必须打电话ICityRepository.FindByZip(zip)

    我的模型中有以下代码

    class Order
    { 
        . . .
    
        [Inject]
        public ICityRepository CityRepository { get; set; }
    
        private City _dCity;
    
        public City DeliveryCity {
            get {
                if (_dCity == null)
                    _dCity = this.CityRepository.FindByZip(this.DeliveryZip);
    
                return _dCity;
            }
        }
        . . .
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 上述代码会出现什么问题?它应该使用域名服务吗?

  3. 域服务实现应该在核心内部还是在基础架构层中定义?

Dmi*_*try 5

上述代码会出现什么问题?它应该使用域名服务吗?

这里要考虑两件事:

  1. ICityRepository不是Order的真正依赖,换句话说,Order不需要它的其他方法.真正的依赖是对象无法使用的东西.所以,你可能要考虑将它作为一个参数,如"方法GetDeliveryCity"(见这个细节).

  2. 通过邮政编码查找城市似乎不是订单的责任.为了具有凝聚力,它必须仅处理与订单相关的功能.您可能希望从订单类中获取此功能.

域服务实现应该在核心内部还是在基础架构层中定义?

如果这是真正的域服务(不是应用程序服务),则在核心内部.


Son*_*ate 5

这就是工厂适应领域的地方.OrderFactory可以采用依赖关系,例如对IOrderRepository的依赖关系以及对ICityRepository的依赖关系.当工厂用于创建(或重组)Order实体时,工厂可以查找City并相应地设置Order属性.或者,正如herzmeister建议的那样,使用Lazy设置它,因此只在需要时才执行查找.