我正在使用UnitOfWork实现读取旧代码,其编码如下:
public class UnitOfWork : IUnitOfWork
{
private MainContext _context = new MainContext();
private Dictionary<string, IRepository> _repositories;
public UnitOfWork(MainContext context)
{
_context = context;
_repositories = new Dictionary<string, IRepository>();
}
public void Register(IRepository repository)
{
_repositories.Add(repository.GetType().Name, repository);
}
public void Commit()
{
_context.SaveChanges();
}
}
在存储库方面,工作单元和上下文都是构造函数注入的。以下是其中两个存储库:
public class RegistrationRepository : IRegistrationRepository
{
private MainContext _context = new MainContext();
private UnitOfWork _uow = new UnitOfWork();
public RegistrationRepository(IUnitOfWork uow, MainContext context)
{
_context = context;
_uow = uow;
}
// code omitted
}
public class EmployeeRepository : IEmployeeRepository
{
private MainContext _context = new MainContext();
private UnitOfWork _uow = new UnitOfWork();
public EmployeeRepository(IUnitOfWork uow, MainContext context)
{
_context = context;
_uow = uow;
}
// code omitted
}
如果我理解正确,当我在Business Logic类中注入这两个存储库时,它们都将使用相同的上下文,因此UnitOfWork也是如此,因此在调用uow.Commit()时我可以具有事务性。
我想问的是uow.Register()的目的是什么?我已经看到一些UoW实现具有使用此代码的Commit()方法:
public void Commit()
{
_repositories.ToList().ForEach(x => x.Value.Submit());
}
这是我理解注册,因为提交循环遍历所有存储库。但是在第一个例子中,我们只是将SaveChanges保存到上下文中,因此我不确定是否需要Register。
总结一下,我有3个问题:
如果我可以使用context.SaveChanges()而不注册存储库,那么UoW实现中Register方法的目的是什么?
在上一个示例代码中,所有存储库都有循环,这真的是事务性的(所有成功还是全部失败)?
哪个更优选?您还可以发布Submit()的可能实现吗?我在这个链接中看到了这个例子
Dependency injection in unit of work pattern using repositories
但是接受的答案只有在IRepository中定义的Submit(),但是在他的具体Repository中,它是缺失的。
答案 0 :(得分:0)
Here是一篇关于dbContext和方法的长篇文章。