c# - 具有领域驱动设计的存储库模式会成为反模式吗?

标签 c# domain-driven-design

<分区>

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

大多数时候我在使用 Repository 模式时会看到以下内容。

  1. 我们有一个通用存储库
  2. 我们的模型只包含一组公共(public)属性,但不包含任何方法(因此根据 DDD 的定义,它变成了贫血领域模型),因为这里的存储库类处理该实体或模型的其他过程。

请为我的查询提供您宝贵的答案。

让我澄清一些事情。

通用存储库是指由实体存储库实现的通用接口(interface)。

我的困惑是关于以下事情

例如: 假设我要保存

    public class User
    {
        public int Id { get; set;}
        public string Name { get; set};
    }

    public class UserRepository : IRepository<User>  
    {  
        // All Operation Like Save / Get /  UserEntity (Domain Object)       
    }

所以这是我的 User 类,它什么也不做,而是由 UserRespository 处理的属性和其他操作。所以我的用户是贫血领域模型。 (因为它没有做任何具体的事情)

在附图中,我考虑了 ProductRepository,所以我的问题是:我的 Product 类是 Anemic 模型吗?

请考虑按照示例图片了解我要说的内容。

enter image description here

最佳答案

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

有些人建议使用更小的接口(interface),例如 IReadableIWriteableIUpdateableIDeleteable。我认为这种方法更加困惑。

就个人而言(这只是我自己的解决方案,在让其他一切都顺利运行之后),对于 DDD,我更喜欢为每个存储库使用一个接口(interface)(主要用于 IoC 和单元测试)。这为我提供了 IUserRepositoryIAuditLogRepository 等。我的存储库还采用(作为参数)并返回域实体(聚合根或仅单个实体)。这样就没有贫血的 DTO 对象来维护或扰乱我的解决方案。但是,我仍然使用 View 模型将敏感数据排除在我的 View 之外。

网上有很多支持和反对存储库模式的争论。

关于c# - 具有领域驱动设计的存储库模式会成为反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18095523/

相关文章:

c# - 在 C# 中定义集合访问器时如何避免堆栈溢出错误

c# - 写入位图时无法在 asp.net c# 中找到字体

c# - .net Lock - 两个问题

c# - DDD : entity's collection and repositories

entity - 领域驱动设计 : How to deal with User Entities in different bounded context?

java - Spring JPA,更新实体属性时的附加数据库操作

c# - Azure 表 GetSharedAccessSignature endPartitionKey 参数

c# - 在字典中存储对对象的引用

domain-driven-design - 在 ddd 中,所有调用都应该通过聚合根路由吗?

design-patterns - DDD-值对象与。实体对象