我正在使用以下UnitOfWork类,以便通过使用泛型获取我的实体的存储库。
public class UnitOfWork : IUnitOfWork
{
private readonly EfDbContext _context;
public UnitOfWork()
{
_context = new EfDbContext();
}
public IRepository<T> RepositoryFor<T>() where T : Entity
{
return new Repository<T>(_context);
}
public void Save()
{
_context.SaveChanges();
}
}
但是,我遇到了一些问题,我有两个单独的类为单个实体独立地实例化 UnitOfWork,这意味着为该实体创建了两个存储库。当我尝试保存实体时, 这会导致实体框架抛出“一个实体对象不能被多个 IEntityChangeTracker 实例引用”错误的问题。
我认为我需要更密切地遵循Tom Dykstra在“创建工作单元类”部分下的这篇文章中描述的 UOW 模式,其中存储库存储在私有字段中,如果存在则重用,如果为空则创建。我遇到的问题是我希望我的 UOW 继续使用泛型 -Repository<T>
而不必为我在代码中拥有的所有实体类型声明私有存储库字段。
我如何能够存储给定类型的存储库已经实例化的事实并重新使用它而不是创建它的新实例?
---编辑:这是修复---
使用 Ninject,我调整了我的绑定,通过指定仅实例化存储库和 UOW 的单个实例InRequestScope
kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope();
//kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); // Removed based on comment below
kernel.Bind(typeof(EfDbContext)).ToSelf().InRequestScope();