7

这几天我一直在研究洋葱架构。我了解依赖项应该始终朝向中心,以及如何使用依赖项注入来实现这一点。但是我有几个问题我仍然无法弄清楚。

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

    eg:一个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;
            }
        }
        . . .
    }
    
  2. 上面的代码会有什么问题?它应该改用域服务吗?

  3. 领域服务实现应该在核心层还是在基础设施层定义?

4

3 回答 3

5

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

这里需要考虑两件事:

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

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

领域服务实现应该在核心层还是在基础设施层定义?

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

于 2012-05-04T16:45:20.883 回答
5

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

于 2012-05-14T13:04:43.937 回答
0
  1. 怎么样

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

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

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

  3. 我想说这真的取决于特定域服务的功能和使用位置。

于 2012-05-04T17:08:54.283 回答