Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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/5/ruby-on-rails-4/2.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#_Domain Driven Design - Fatal编程技术网

C# 具有域驱动设计的存储库模式是否成为反模式?

C# 具有域驱动设计的存储库模式是否成为反模式?,c#,domain-driven-design,C#,Domain Driven Design,首先,我想澄清一下,我是领域驱动设计的新手,我问这个问题是因为我读过一些叫做贫血领域模型的东西 大多数情况下,我在使用存储库模式时会看到以下内容 我们有一个通用存储库 我们的模型只包含一组公共属性,但不包含任何方法(因此根据DDD的定义,它成为贫血的域模型),因为在这里存储库类处理该实体或模型的其他过程 请为我的问题提供有价值的答案 让我澄清几件事 通用存储库是指由实体存储库实现的通用接口 我的困惑是关于以下事情 例如: 假设我想省钱 公共类用户 { 公共int Id{get;set;} 公共字

首先,我想澄清一下,我是领域驱动设计的新手,我问这个问题是因为我读过一些叫做贫血领域模型的东西

大多数情况下,我在使用存储库模式时会看到以下内容

  • 我们有一个通用存储库
  • 我们的模型只包含一组公共属性,但不包含任何方法(因此根据DDD的定义,它成为贫血的域模型),因为在这里存储库类处理该实体或模型的其他过程
  • 请为我的问题提供有价值的答案

    让我澄清几件事

    通用存储库是指由实体存储库实现的通用接口

    我的困惑是关于以下事情

    例如: 假设我想省钱

    公共类用户
    {
    公共int Id{get;set;}
    公共字符串名称{get;set};
    }
    公共类用户存储库:IRepository
    {  
    //所有操作,如Save/Get/UserEntity(域对象)
    }
    
    这里是我的用户类,它不做任何事情,而是通过
    UserRespository
    拥有属性和其他操作句柄。所以我的用户是贫血的领域模型。(因为它没有做任何具体的事情)

    在附图中,我考虑了<代码> Product TestPosior <代码>,所以我的问题是:我的产品类是贫血模型吗?< /P> 请考虑下面的样本图像,我想说的是:


    存储库模式本身并不是一种反模式,但我已经看到了DDD的许多实现,其中存储库模式提供的价值很少或没有价值。将您的n层提供无价值分层体系结构交给务实的核心专家dev,他可能会对您提出“反模式”的批评(我可能会说这是正确的)

    存储库模式优点:

  • 底层持久性技术的抽象
  • 定义聚合根的可能性,只有聚合根应该有存储库
  • 一种明确说明哪些操作对所讨论的聚合根有效的方法,例如,如果删除实体无效,则存储库应该没有delete方法
  • 无需数据库即可轻松测试的内容(删除存储库)
  • 存储库模式的缺点:

  • 接近您的持久性技术
  • 另一层
  • 就我个人而言,我更喜欢在进行DDD时使用存储库模式,但您的解决方案听起来更像活动记录模式,因此从一开始就消除了使用存储库的大部分好处。我从不使用通用存储库,因为它们删除了pros 2和pros 3(我可以使用通用实现,但我不会将其直接公开给存储库使用者代码)


    另外:不要使用存储库来填充DTO、ViewModels等。使用单独的模型和技术来建模写入(DDD可以很好地工作)和读取。

    我同意
    IRepository
    接口通常是浪费时间。如果我将基本的CRUD操作放在我的
    IRepository
    界面中,那么如何处理审计数据之类的数据?在禁止删除的地方。当我尝试调用
    Delete()
    时,是否应该返回一个
    invalidoOperationException

    一些人建议使用更小的界面,如
    IReadable
    IWriteable
    IUpdateable
    Ideletable
    。我认为这种方法更加混乱

    就个人而言(这只是我自己的解决方案,在对所有其他问题都进行了良好的分析之后),对于DDD,我更喜欢使用每个存储库的接口(主要用于IoC和单元测试)。这为我提供了
    IUserRepository
    IAuditLogRepository
    ,等等。我的存储库还接受(作为参数)并返回域实体(聚合根或仅单个实体)。这样,就不会有贫乏的DTO对象来维护或扰乱我的解决方案。但是,我仍然使用视图模型将敏感数据排除在视图之外


    在线上有很多支持和反对存储库模式的论据。

    您能详细说明一下吗?是什么让您认为存储库将是一个反模式?有人的意见?你自己的?如果您希望得到有价值的答案,请在这个问题中添加一些价值:)存储库是反模式的,这不是我自己的观点,但我混淆了贫乏的领域模型定义和存储库模式。与存储库模式类似,请注意实体的保存,但实体本身没有任何保存方法。这在DDD中完全有效,将存储库视为服务。DDD\CQRS邮件列表中有一个关于这个问题的主题:“我们有一个通用存储库”是什么意思。每个聚合都应该有特定的存储库,而不是通用的存储库。