2

我有 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
}
4

2 回答 2

0

它有点像EF DataContext

EntityFramework 的 DataContext是一个工作单元,有点像存储库(或存储库的集合

我更喜欢将这些东西分开并使用依赖注入框架(如结构映射)。

您可以询问结构图,IRepository<Customer>它会为您提供实例。

将UoW从您的存储库中分离出来。

您可以拥有一个UoW类(使用类似的方法:) SubmitChanges,然后是 Your Repositories(每个使用类似的方法Add, Delete, ...:)

于 2012-06-27T15:00:16.077 回答
0

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

UoW 为我带来了 2 个重要的事情/优势;

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

  2. Unit of Work 减少了很多依赖注入。

这是将 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();
于 2019-08-14T13:24:41.967 回答