关于存储库模式,有些东西困扰着我。
存储库的实际用途是什么?我把它理解为Domain.Model的一部分,它提供了在聚合上执行命令的方法,就是它。
现在,如果您使用的是提供CUD方法的泛型,您可能会说您的域不是泛型的,所以存储库不是泛型的,而且我同意,但只从一个角度来看,发出的查询不是泛型的,而不是命令。
我觉得通用存储库消除了对Domain.Repositories的需求,至少在DDD与CQRS混合的上下文中是这样的(我知道我听起来可能有争议,这也正是我的感觉)。但是,如果将命令从查询中分离出来,那么WriteRepositories将只包含CUD操作。所以这里到处都是复制品。
想象一下
CustomerRepository : ICustomerRepository
{
void Add(CustomerAggregate agg);
void Update(CustomerAggregate agg);
}
BookRepository : IBookRepository
{
void Add(BookAggregate agg);
}
SubscriptionsRepository : ISubscriptionsRepository
{
void Add(SubscriptionAggregate agg);
void Update(SubscriptionAggregate agg);
void Delete(SubscriptionAggregate agg);
}.另外5次回购
那么,在使用Command.Stack + Query.Stack模式的DDD上下文中,泛型存储库是否有意义?如果是,它是否消除了对Domain.Repositories (命令存储库)的需求?
发布于 2018-11-08 03:07:00
存储库的实际用途是什么?
Evans (蓝皮书)的第6章详细介绍了存储库模式。存储库“提供内存集合中的幻觉.”
存储库减轻了客户端的巨大负担,客户端现在可以与一个简单的、显示意图的接口以及它在模型方面所需要的内容进行对话。 它们将应用程序和域设计与持久性技术、多个数据库策略甚至多个数据源分离开来。
它不是域模型的一部分,也不直接支持命令执行。相反,它是一种抽象,它将理解域行为的代码(通过聚合根的API )与理解如何在持久化表示和内存表示中执行数据查找和转换的代码分开。
我把它理解为Domain.Model的一部分,它提供了在聚合上执行命令的方法,就是它。
不怎么有意思?聚合根是域模型的一部分,知道如何组装它们的工厂也是如此。
但是,存储库实际上并不是域模型的一部分;域模型根本不使用存储库;应用层使用它们,基础结构层提供实现。
在使用CQRS模式的DDD上下文中,泛型存储库也有意义吗?
推广CQRS模式的人不是泛型存储库接口的狂热粉丝。
发布于 2020-08-01 14:19:04
并非所有域实体都可以删除或更新。我想说的是,拥有一个包含CUD操作的基本存储库,然后您可以从中派生出自己的EntityRepository,只允许对特定实体进行有意义的操作,这是一种很好的方法。
发布于 2018-11-07 22:08:59
如果您有问题,可以使用一个通用存储库.否则不要使用通用存储库..。您还可以定义一个通用的基本存储库,并让您的其他存储库从它继承公共功能:
public class RepositoryBase<TEntity> : IRepositoryBase<TEntity>
where TEntity : class
{
// generic add logic
public virtual void Add(TEntity entity)
{
DbSet.Add(entity);
Context.SaveChanges();
}
// generic update logic
public virtual void Update(TEntity entity)
{
DbSet.Attach(entity);
Context.Entry(entity).State = EntityState.Modified;
}
}现在,在您的子存储库中,您可以重写泛型定义.例如,在这里,我想为我的聚合根之一定义一个存储库,我希望它覆盖Add逻辑.并继承现有的Update逻辑:
public class MyAggRootRepository<TEntity> : RepositoryBase<MyAggRoot>,
IMyAggRootRepository<MyAggRoot>
{
public override void Add(TEntity MyAggRoot)
{
if (MyAggRoot.Id > 0 )
{
throw new Exception("Invalid request, Id > 0 means model is already added.");
}
DbSet.Add(MyAggRoot);
Context.SaveChanges();
}
// happy with the inherited Update logic
}同样,通用存储库的选择是关于问题的本质.
https://stackoverflow.com/questions/53197011
复制相似问题