我有一个独特的情况,我正在构建一个需要访问Active Directory和SQL数据库作为持久性的基于DDD的系统。最初,这wasnt一个问题,因为我们的设计是建立在那里我们有一个看起来像这样的工作单元:在处理多个数据存储时,如何实现存储库模式和工作单元?
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)
}
这解决了与实体框架数据访问的问题,但并没有解决我们的Active Directory集成的问题。之前,它在存储库的Save()方法中,但现在它没有家。工作单元除了实体框架数据上下文外什么都不知道。这个逻辑应该到哪里去?我认为这种设计只适用于只有一个数据存储使用实体框架的情况。任何想法如何最好地处理这个问题?我应该把这个逻辑放在哪里?