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



我已经研究洋葱建筑几天了。我知道依赖关系应该始终朝中心方向发展,以及如何使用依赖注入来实现这一点。但是我有几个问题我仍然无法弄清楚。

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

    例如:Order实体通过Oder.DeliveryZip属性建立DeliveryCity关系,不是外键,而是唯一的。为了得到城市拉链,我必须打电话给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;
            }
        }
        . . .
    }
    
  2. 上述代码会有什么问题?它应该改用域服务吗?

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

这就是工厂适合该领域的地方。 OrderFactory 可以接受依赖关系,例如对 IOrderRepository 的依赖以及对 ICityRepository 的依赖。 当工厂用于创建(或重建)订单实体时,工厂可以查找城市并相应地设置 Order 属性。 或者,正如 herzmeister 建议的那样,使用 Lazy 进行设置,以便仅在需要时执行查找。

上述代码会有什么问题?它应该改用域服务吗?

这里需要考虑两件事:

  1. ICityRepository不是 Order 的真正依赖关系,换句话说,Order 的其他方法不需要它。真正的依赖是对象无法没有的东西。因此,您可能需要考虑将其作为参数传递给诸如" GetDeliveryCity "之类的方法(有关详细信息,请参阅此处)。

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

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

在核心内部,如果这确实是域服务(不是应用程序服务)。

  1. 怎么样

    private Lazy<City> _dCityLazy;
    public City DeliveryCity {
        get {
            return _dCityLazy.Value;
        }
    }
    

    你会通过某种机制在哪里注入Lazy<City>

  2. 在这个例子中,你可以通过从外部注入来灵活地决定。

  3. 我想说这实际上取决于特定域服务的作用以及使用位置。

最新更新