我已经研究洋葱建筑几天了。我知道依赖关系应该始终朝中心方向发展,以及如何使用依赖注入来实现这一点。但是我有几个问题我仍然无法弄清楚。
-
模型(或实体)是否可以引用存储库接口或服务接口?
例如:
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; } } . . . }
-
上述代码会有什么问题?它应该改用域服务吗?
-
域服务实现应该在核心内部还是在基础结构层定义?
这就是工厂适合该领域的地方。 OrderFactory 可以接受依赖关系,例如对 IOrderRepository 的依赖以及对 ICityRepository 的依赖。 当工厂用于创建(或重建)订单实体时,工厂可以查找城市并相应地设置 Order 属性。 或者,正如 herzmeister 建议的那样,使用 Lazy 进行设置,以便仅在需要时执行查找。
上述代码会有什么问题?它应该改用域服务吗?
这里需要考虑两件事:
-
ICityRepository
不是 Order 的真正依赖关系,换句话说,Order 的其他方法不需要它。真正的依赖是对象无法没有的东西。因此,您可能需要考虑将其作为参数传递给诸如"GetDeliveryCity
"之类的方法(有关详细信息,请参阅此处)。 -
按邮政编码查找城市似乎不是订单的责任。为了使订单具有凝聚力,它必须仅处理与订单相关的功能。您可能希望从订单类中删除此功能。
域服务实现应该在核心内部还是在基础结构层定义?
在核心内部,如果这确实是域服务(不是应用程序服务)。
-
怎么样
private Lazy<City> _dCityLazy; public City DeliveryCity { get { return _dCityLazy.Value; } }
你会通过某种机制在哪里注入
Lazy<City>
? -
在这个例子中,你可以通过从外部注入来灵活地决定。
-
我想说这实际上取决于特定域服务的作用以及使用位置。