我知道网上有很多类似的信息,也有关于stackoverflow的信息,但是我仍然不确定在哪里将持久性逻辑放入我的项目中。我还没有使用任何ORM,IoC和UnitOfWork概念(对于ddd世界中的初学者来说太多了。)

我的订单模型有两个选择:


在Domain程序集中,有一个Order类和一个IOrderRepository接口。 Order类具有IOrderRepository的私有实例,该实例在构造函数中传递。订单类具有公共的Insert方法,该方法调用IOrderRepository.Insert方法。存储库的实际实现在基础结构层的OrderRepository类中。服务层将包含一个OrderService类,该类使用适当的存储库实例化我的模型,然后调用Order.Insert()。坏处:我们必须将存储库的接口(或多个实例)注入到模型类中,持久性逻辑在模型内部。好处:有时在插入方法被调用之前或之后必须要做一些事情,并且这很可能适合Insert类的Order方法,例如引发域事件或其他任何事情。
Model程序集中只有Order类。服务层创建新的Order和新的OrderRepository并执行orderRepository.Insert(order)


您能用简单的词来解释哪个概念更好(像我五岁那样解释)。

最佳答案

您的域类应仅专注于域的业务逻辑,并且它们应是持久的无知的(即,持久性应与业务逻辑分开)。添加与持久性相关的操作违反了“单一责任原则”。同样,对存储库的依赖使您的域类变得复杂,而不是简单的POCO实体。

让我们从编码的角度考虑这种设计。您必须为每个Order提供存储库实例,然后调用order.Insert()将此订单传递给已注入订单的存储库。听起来很复杂。使用repository.Save(order)更简单。有时在类上具有CRUD方法是可以的(请参见Active Record模式)。但是,当您没有复杂的域模型时,此方法很好。

我认为保留您的域的最佳位置是应用程序服务(也许您将此层称为服务层)。他们从存储库加载实体,执行操作(可能是对实体的简单操作,或对域服务的调用),然后保存域状态。

关于c# - 域驱动设计中持久性的呼唤在哪里,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22300258/

10-11 06:31
查看更多