在UnitOfWork实现中注册存储库的目的

时间:2016-09-12 10:40:20

标签: c# entity-framework asp.net-core repository-pattern unit-of-work

我正在使用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个问题:

  1. 如果我可以使用context.SaveChanges()而不注册存储库,那么UoW实现中Register方法的目的是什么?

  2. 在上一个示例代码中,所有存储库都有循环,这真的是事务性的(所有成功还是全部失败)?

  3. 哪个更优选?您还可以发布Submit()的可能实现吗?我在这个链接中看到了这个例子

  4. Dependency injection in unit of work pattern using repositories

    但是接受的答案只有在IRepository中定义的Submit(),但是在他的具体Repository中,它是缺失的。

1 个答案:

答案 0 :(得分:0)

  1. 我想的目的是每个实体只创建一个存储库,以便以后可以通过按键从UoW中检索它来重用相同的存储库。
  2. 如果它使用不同的上下文 - 不。
  3. 通常,您希望每个业务操作都有一个事务,因此只有一个提交。
  4. Here是一篇关于dbContext和方法的长篇文章。