gpt4 book ai didi

entity-framework - 使用存储库模式、工作单元和 Unity 的 Entity Framework

转载 作者:行者123 更新时间:2023-12-03 20:53:29 25 4
gpt4 key购买 nike

使用 this example 提供的组合和 this implementation我正在尝试创建一个解耦 UnitOfWork 的解决方案来自各个存储库的类,因为它们违反了开闭原则,因为每次添加新存储库时都必须修改 UnitOfWork类(class)。我使用 Unity 作为 IoC 容器来连接依赖项。

我遇到的问题是自动连接 UnitOfWork , IDbContext以及使用 Unity 的存储库( IEmployeeRepositoryICustomerRepository ),存储库将注入(inject) UnitOfWork 的单独实例,这当然违背了目的。我需要在存储库之间共享上下文,看来我错过了这个难题的一部分 - 目前(参见服务层)UnitOfWork实例化将不同于 UnitOfWork对于每个存储库。

如何注入(inject) IUnitOfWork进入服务层并传递这个实例化的共享UnitOfWork类到各自的存储库,使用 Unity 和依赖注入(inject)?

这是我提出的(制造的)解决方案:

存储库

public interface IRepository<TEntity> where TEntity : class
{
TEntity Create();
// omitted for brevity
}

public class Repository<TEntity> : IRepository<TEntity>
where TEntity : class
{
private readonly DbContext _context;

public Repository(IUnitOfWork uow)
{
_context = uow.Context;
}

public virtual TEntity Create(TEntity entity)
{
return _context.Set<TEntity>().Add(entity);
}

// omitted for brevity
}

public interface IEmployeeRepository : IRepository<Employee>
{
}

public interface ICustomerRepository : IRepository<Customer>
{
}

public class EmployeeRepository : Repository<Employee>
{
public EmployeeRepository(IUnitOfWork uow)
: base(uow)
{
}
}

public class CustomerRepository : Repository<Customer>
{
public CustomerRepository(IUnitOfWork uow)
: base(uow)
{
}
}

数据库上下文工厂
public interface IDbContextFactory
{
DbContext GetContext();
}

public class DbContextFactory : IDbContextFactory
{
private readonly DbContext _context;

public DbContextFactory()
{
_context = new MyDbContext("ConnectionStringName");
}

public DbContext GetContext()
{
return _context;
}
}

工作单位
public interface IUnitOfWork
{
void SaveChanges();
DbContext Context { get; }
}

public class UnitOfWork : IUnitOfWork, IDisposable
{
private readonly DbContext _context;
private bool disposed = false;

public UnitOfWork(IDbContextFactory contextFactory)
{
_context = contextFactory.GetContext();
}

public void SaveChanges()
{
if (_context != null)
{
_context.SaveChanges();
}
}

public DbContext Context
{
get { return _context; }
}

protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
_context.Dispose();
}
}
disposed = true;
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}

服务
public class CompanyService
{
private readonly IUnitOfWork _uow;
private readonly IEmployeeRepository _employeeRepository;
private readonly ICustomerRepository _customerRepository;

public CompanyService(IUnitOfWork uow, IEmployeeRepository employeeRepository, ICustomerRepository customerRepository)
{
_uow = uow;
_employeeRepository = employeeRepository;
_customerRepository = customerRepository;
}

// over-simplified example method
public void AddEmployeeAndCustomer()
{
_employeeRepository.Create(new Employee {Id = 1, Name = "Test Employee"});
_customerRepository.Create(new Customer { Id = 2, Name = "Test Customer" });

_uow.SaveChanges();
}

}

最佳答案

我认为您正在寻找的是每个请求生命周期管理器,以便在请求期间您只获得一个 UnitOfWork 实例和一个 DbContext 实例。 Unity 3 有 Unity bootstrapper for ASP.NET MVC其中有一个 PerRequestLifetimeManager这可以让你做到这一点。

如果您不使用 ASP.NET,那么您可能会使用 PerResolveLifetimeManager。我见过的另一种方法是 HierarchicalLifetimeManager 与子容器相结合(这使得注册成为子容器中的单例)。

关于entity-framework - 使用存储库模式、工作单元和 Unity 的 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19116851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com