我曾经处理过一些简单的应用程序,其 服务层 包含所有业务逻辑。在 领域驱动设计 中,将业务逻辑保留在丰富的模型中是很常见的。
通过观看 Pluralsight 的教程,他们提到了 存储库 并注意到仓库通常包含基本的 CRUD 操作(创建、更新、获取和删除实体)。关于 Entity Framework 没有太多解释。
Entity Framework 6 和 Entity Framework Core 已经提供了开箱即用的 Repository/UoW。 我想知道在这种情况下是否可以省略创建存储库层?
那么,我如何想象没有单独的存储库层的应用程序...
我的理解是:
例如,我们有一个名为 Customer
的模型作为聚合根(丰富的领域模型)。该模型具有一对多关系 ICollection<Payment> Payments
。此外,根据 DDD - 我们将逻辑保留在模型内部 - 因此我们有 MakePayment
方法。
代码如下:
public class Customer
{
public virtual ICollection<Payment> Payments { get; set; }
// ... other properties/collections
public void MakePayment(decimal amount)
{
this.Payments.Add(new Payment() { Amount = amount });
}
}
通过 Entity Framework,我们可以使用急切加载的方式一次性加载整个数据树,在结果中
Customer
已经包含了他们的所有Payments
映射。
(比如说,我们正在处理一个ASP.NET Web API应用)
因此,为了付款,我想我们需要执行以下操作:
在我们的控制器/服务中获取客户(例如通过
id
)然后跟随代码
customer.MakePayment(10);
然后调用
dbContext.SaveChanges()
方法DbContext
跟踪更改并存储付款 - 太棒了!
关于服务层:
在这样的Web应用程序中,拥有DDD的服务层是否可行? 我仍然认为将代码保留在控制器中并不一定是正确的选择(即使采用了DDD),只要在WPF应用程序中可能需要部分功能-因此我们可以使用Service Layer实现。 看起来像是最优的方法,对吧?