C# 具有域驱动设计的存储库模式是否成为反模式?
首先,我想澄清一下,我是领域驱动设计的新手,我问这个问题是因为我读过一些叫做贫血领域模型的东西 大多数情况下,我在使用存储库模式时会看到以下内容C# 具有域驱动设计的存储库模式是否成为反模式?,c#,domain-driven-design,C#,Domain Driven Design,首先,我想澄清一下,我是领域驱动设计的新手,我问这个问题是因为我读过一些叫做贫血领域模型的东西 大多数情况下,我在使用存储库模式时会看到以下内容 我们有一个通用存储库 我们的模型只包含一组公共属性,但不包含任何方法(因此根据DDD的定义,它成为贫血的域模型),因为在这里存储库类处理该实体或模型的其他过程 请为我的问题提供有价值的答案 让我澄清几件事 通用存储库是指由实体存储库实现的通用接口 我的困惑是关于以下事情 例如: 假设我想省钱 公共类用户 { 公共int Id{get;set;} 公共字
公共类用户
{
公共int Id{get;set;}
公共字符串名称{get;set};
}
公共类用户存储库:IRepository
{
//所有操作,如Save/Get/UserEntity(域对象)
}
这里是我的用户类,它不做任何事情,而是通过UserRespository
拥有属性和其他操作句柄。所以我的用户是贫血的领域模型。(因为它没有做任何具体的事情)
在附图中,我考虑了<代码> Product TestPosior <代码>,所以我的问题是:我的产品类是贫血模型吗?< /P>
请考虑下面的样本图像,我想说的是:
存储库模式本身并不是一种反模式,但我已经看到了DDD的许多实现,其中存储库模式提供的价值很少或没有价值。将您的n层提供无价值分层体系结构交给务实的核心专家dev,他可能会对您提出“反模式”的批评(我可能会说这是正确的) 存储库模式优点:
另外:不要使用存储库来填充DTO、ViewModels等。使用单独的模型和技术来建模写入(DDD可以很好地工作)和读取。我同意
IRepository
接口通常是浪费时间。如果我将基本的CRUD操作放在我的IRepository
界面中,那么如何处理审计数据之类的数据?在禁止删除的地方。当我尝试调用Delete()
时,是否应该返回一个invalidoOperationException
一些人建议使用更小的界面,如IReadable
、IWriteable
、IUpdateable
或Ideletable
。我认为这种方法更加混乱
就个人而言(这只是我自己的解决方案,在对所有其他问题都进行了良好的分析之后),对于DDD,我更喜欢使用每个存储库的接口(主要用于IoC和单元测试)。这为我提供了IUserRepository
,IAuditLogRepository
,等等。我的存储库还接受(作为参数)并返回域实体(聚合根或仅单个实体)。这样,就不会有贫乏的DTO对象来维护或扰乱我的解决方案。但是,我仍然使用视图模型将敏感数据排除在视图之外
在线上有很多支持和反对存储库模式的论据。您能详细说明一下吗?是什么让您认为存储库将是一个反模式?有人的意见?你自己的?如果您希望得到有价值的答案,请在这个问题中添加一些价值:)存储库是反模式的,这不是我自己的观点,但我混淆了贫乏的领域模型定义和存储库模式。与存储库模式类似,请注意实体的保存,但实体本身没有任何保存方法。这在DDD中完全有效,将存储库视为服务。DDD\CQRS邮件列表中有一个关于这个问题的主题:“我们有一个通用存储库”是什么意思。每个聚合都应该有特定的存储库,而不是通用的存储库。