【发布时间】:2026-01-13 15:45:01
【问题描述】:
我在加入 DDD 和 EF Core 时遇到问题。
我正在使用 DDD 架构制作项目。作为数据访问级别,我使用来自here 的通用工作单元模式。
public interface IUnitOfWork
{
IRepository<TDomain> Repository<TDomain>() where TDomain : class;
}
public interface IRepository<TDomain>
{
TDomain Get(Expression<Func<TDomain, bool>> predicate);
}
我使用 EF Core 实现这些接口。
我有一些包含 2 个类的域模型
public class MainClass
{
public int Id { get; set; }
public List<RelatedItem> Items { get; set; }
}
public class RelatedItem
{
public int Id { get; set; }
public MainClass Parent { get; set; }
public DateTime Date { get; set; }
public string SomeProperty { get; set; }
}
在我的项目MainClass 的现实生活中收集了数百个RelatedItems。为了执行某些操作,每个请求我只需要一个RelatedItem 和某个日期。可以通过Items属性搜索来完成。
在工作单元中封装 EF Core 的性能我必须从数据库中显式加载带有相关项目的实体,因为业务登录层对 UnitOfWork 存储库的实现一无所知。但是这个操作很慢。
所以我决定创建MainClassService,它注入costructor unitOfWork 并有一个只返回一个RelatedItem 的方法,它工作正常。
public class MainClassService
{
IUnitOfWork unitOfWork;
public MainClassService(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork ?? throw new ArgumentNullException();
}
public RelatedItem GetRelatedItemByDate(int mainClassId, DateTime date)
{
return unitOfWork.Repository<RelatedItem>().Get(c => c.Parent.Id == mainClassId && c.Date == date);
}
}
因此,由于 EF Core,我无法直接使用属性 Items,但由于 DDD 架构,我应该使用它们。
而我的问题是:使用这样的结构可以吗?
【问题讨论】:
-
您的要求有点不清楚。您是在问是否可以将
unitOfWork注入MainClassService还是在问您应该遵循哪个概念模型(EF Core 与 DDD 方法)?如果是后者,在 DDD 中,您的域对象应该是不了解持久性的。不要让 EF 决定您如何与域对象交互。相反,让 EF(或其他 DAL 代码,如您的存储库)适应您的 DDD 架构。 -
什么是让您创建这两个领域模型类的业务规则?
-
@bman7716 你说得对,我对后者感兴趣。
-
@Constantin Galbenu 这只是一个例子。一个包含大量相关实体的聚合
-
@Timothy 相关还是嵌套?
标签: c# entity-framework domain-driven-design ef-core-2.0 ddd-repositories