我有一个独特的情况,我正在构建一个基于 DDD 的系统,该系统需要同时访问 Active Directory 和 SQL 数据库作为持久性。最初这不是问题,因为我们的设计是在我们有一个看起来像这样的工作单元的地方设置的:
public interface IUnitOfWork
{
void BeginTransaction()
void Commit()
}
我们的存储库看起来像这样:
public interface IRepository<T>
{
T GetByID()
void Save(T entity)
void Delete(T entity)
}
在这个设置中,我们的加载和保存将处理两个数据存储之间的映射,因为我们自己编写了它。工作单元将处理事务并包含存储库将用于持久性的 Linq To SQL 数据上下文。活动目录部分由基础设施中实现的域服务处理,并由每个 Save() 方法中的存储库使用。Save() 负责与数据上下文交互以执行所有数据库操作。
现在我们正在尝试使其适应实体框架并利用 POCO。理想情况下,我们不需要 Save() 方法,因为对象上下文正在跟踪域对象,我们只需要在工作单元上添加 Save() 方法以让对象上下文保存更改,以及一种方法用上下文注册新对象。新提议的设计看起来更像这样:
public interface IUnitOfWork
{
void BeginTransaction()
void Save()
void Commit()
}
public interface IRepository<T>
{
T GetByID()
void Add(T entity)
void Delete(T entity)
}
这解决了实体框架的数据访问问题,但没有解决我们的活动目录集成的问题。以前,它在存储库的 Save() 方法中,但现在它没有家了。工作单元只知道实体框架数据上下文。这个逻辑应该去哪里?我认为这种设计只有在您只有一个使用实体框架的数据存储时才有效。任何想法如何最好地解决这个问题?我应该把这个逻辑放在哪里?