Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于实体框架和存储库模式的领域驱动设计_C#_Entity Framework_Domain Driven Design_Repository Pattern - Fatal编程技术网

C# 基于实体框架和存储库模式的领域驱动设计

C# 基于实体框架和存储库模式的领域驱动设计,c#,entity-framework,domain-driven-design,repository-pattern,C#,Entity Framework,Domain Driven Design,Repository Pattern,我曾经处理过一些简单的应用程序,它们的服务层包含了所有的业务逻辑。在领域驱动的设计中,通常将业务逻辑保持在一个丰富的模型中 观看了Pluralsight的一个教程,其中他们提到了存储库,并注意到repo通常包含基本的CRUD操作创建、更新、获取和删除实体。关于实体框架,没有做太多解释 实体框架6和实体框架核心已经提供了现成的存储库/UoW。我想知道在这种情况下是否可以省略创建存储库层 因此,我如何想象没有独立存储库层的应用程序 我的理解是: 例如,我们将客户模型作为聚合的根丰富域模型。该模型与收

我曾经处理过一些简单的应用程序,它们的服务层包含了所有的业务逻辑。在领域驱动的设计中,通常将业务逻辑保持在一个丰富的模型中

观看了Pluralsight的一个教程,其中他们提到了存储库,并注意到repo通常包含基本的CRUD操作创建、更新、获取和删除实体。关于实体框架,没有做太多解释

实体框架6和实体框架核心已经提供了现成的存储库/UoW。我想知道在这种情况下是否可以省略创建存储库层

因此,我如何想象没有独立存储库层的应用程序

我的理解是:

例如,我们将客户模型作为聚合的根丰富域模型。该模型与收款付款之间存在一对多关系。另外,根据DDD,我们将我们的逻辑保留在模型中,因此我们有了支付方法

代码如下:

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 });
    }
}
使用实体框架,我们可以急切地加载整个树,结果是客户已经映射了他们的所有付款

比如说,我们处理的是一个ASP.NET WebAPI应用程序

因此,为了付款,我想,我们应该做以下几点:

在我们的控制器/服务中,我们通过id获取客户

然后遵循代码customer.MakePayment10

然后我们调用dbContext.SaveChanges方法

DbContext跟踪更改并存储付款-宾果

我的理解正确吗

关于服务层:

在这样的web应用程序中使用带有DDD的服务层可以吗

我仍然认为,即使使用DDD,将代码保存在控制器中也不一定是正确的做法,因为WPF应用程序可能需要部分功能,因此我们可以使用服务层

似乎是最理想的方法,不是吗?

我想知道在这种情况下我们是否可以省略创建存储库层

在我看来,您不能忽略存储库层。通常,存储库负责保存和重建聚合根,而域实体不是数据库实体。EF实体不是您的域实体

在这样的web应用程序中使用带有DDD的服务层可以吗

当然,您可以保留您的服务层,实际上,您可以在DDD中称之为应用层,但您需要注意这一层中应该包含什么

我想知道在这种情况下是否可以省略创建存储库层

如第一段所解释的,请考虑直接使用泛型存储库dBET。避免创建额外的存储库层

我的理解正确吗

依我看,若你们已经按照你们在问题模式中所解释的每个请求正确地实施了工作单元会话,那个么你们的理解是正确的。这就是它应该如何工作

在这样的web应用程序中使用带有DDD的服务层可以吗

使用DDD,域模型包括相关逻辑。但是,始终存在不属于任何领域模型的逻辑。这种逻辑通常在服务中使用。因此,是的,您可能仍然需要DDD服务。仅此而已,它不会包含您的所有逻辑,因为大部分逻辑都在模型中


使用DDQD,考虑使用CQRS。使用CQR,您可以将读写分离到数据存储中。在这种情况下,存储库是可选的。如上所述,您可以使用由ORM公开的通用存储库。

这个问题太广泛/基于观点,但我认为您的思路是正确的。附加的repo,不,服务层是的,带有EF类对象的DDD:也许吧。我很感激你的快速回复@GertArnold。但我不认为它太宽。。。实体框架和其他框架不断发展,对于开始使用稍微过时的教程学习DDD的开发人员来说,有越来越多的困惑。再次感谢!有些教程甚至不便宜,而且考虑到现代软件堆栈,它们仍然没有涵盖重要方面:直到像Ayende Rahien这样有影响力的人开始这么做,开发人员社区才慢慢开始接受这样的想法,也许我们可以不使用。而且,正如你所说的,对于像EF这样的ORM,它是一个额外的回购层,这使得它更值得怀疑。