工作单位相关的存储库

时间:2012-06-06 18:57:59

标签: entity-framework c#-4.0 repository-pattern unit-of-work

我有10个POCO课程。 我正在使用一个简单的存储库模式,其工作单元具有IRespoitory接口和UnitOf工作类。

是否正确(正常)将我的所有IRepository放在一个UnitOfWork实例中?

即: 10 POCO类 - 10个IRepository实例 - 只有一个UnitOfWork类,它包含所有10个存储库

UnitOfWork
{
IRepository<Customer> CustomerRepository {get; set;}
IRepository<Customer> CustomerRepository {get; set;}
IRepository<Customer> CustomerRepository {get; set;}
// the same for all others 7 POCo class
// ..other stff
}

2 个答案:

答案 0 :(得分:0)

有点像 EF DataContext

EntityFramework的DataContext 工作单元,有点像存储库(或存储库的集合 >)。

我更喜欢将这些内容分开并使用依赖注入框架(如结构图)。

您可以向{strong 1}}询问 structuremap ,它会为您提供实例。

UoW 存储库分开。

您可以拥有一个 UoW 类(使用类似:IRepository<Customer>的方法),然后使用存储库(每个类型都使用以下方法:SubmitChanges

答案 1 :(得分:0)

是的,您的方法是正确的(正常),一个工作单元类/实例包含所有(POCO类的)存储库。

UoW给我带来2个重要的事情/优点;

  1. 一个显而易见的例子是ACID(原子,一致性,隔离性,持久性)事务,因为只有一个dbcontext跟踪并更新了所有数据库更改。

  2. Unit of Work reduce a lot of dependency Injection.

这是在存储库中使用UoW的完整示例;

public interface IUnitOfWork
{
    IRepository<Customer> Customers { get; }
    IRepository<Order> Orders { get; }
    // the same for all others 8 POCO class

    Task<int> SaveAsync();
}

================================================ =============

public class UnitOfWork : IUnitOfWork
{
    public IRepository<Customer> Customers { get; private set; }
    public IRepository<Order> Orders { get; private set; }
    // the same for all others 8 POCO class

    private readonly MyDBContext _Context;

    public UnitOfWork(MyDBContext context)
    {
        _dbContext       = context;
        Customers        = new Repository<Customer>(_dbContext);
        Orders           = new Repository<Order>(_dbContext);
        // the same for all others 8 POCO class
    }

    public async Task<int> SaveAsync()
    {
        return await _dbContext.SaveChangesAsync();
    }
}

在上述实现中,您可以看到已使用一个dbContext生成所有存储库。这将带来ACID功能。

在您的服务/控制器(或要使用存储库的任何地方)中,您只需要注入1 UoW即可访问所有存储库,如下所示:

    _uow.Customers.Add(new Customer());
    _uow.Ordres.Update(order);
    _uow.SaveAsync();