【发布时间】:2014-04-26 20:47:37
【问题描述】:
作为一个学习过程,我尝试使用存储库模式来实现 UoW,并且我有以下设置:
public interface IUnitOfWork : IDisposable
{
MyEntities Context { get; set; }
string GetConnectionString()
void Complete();
}
public abstract class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class
{
protected MyEntities context;
protected DbSet<TEntity> dbSet;
protected RepositoryBase(IUnitOfWork unitOfWork)
{
context = unitOfWork.Context;
dbSet = context.Set<TEntity>();
}
}
public class ItemRepository : RepositoryBase<Item>, IItemRepository
{
public ItemRepository(IUnitOfWork unitOfWork)
: base(unitOfWork)
{
}
public Item GetById(int id)
{
// return a item
}
}
要实际使用 ItemRespoitory,我正在执行以下操作:
using (var unitOfWork = new UnitOfWork())
{
var ItemRepository = new ItemRepository(unitOfWork);
var item = ItemRepository.GetById(1);
}
效果很好,现在我想使用 IoC/DI 和简单的注入器来做到这一点:
var container = new Container();
container.Register<IUnitOfWork, UnitOfWork>();
container.Register<IItemRepository, ItemRepository>();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
但现在我的问题是,因为我将 ItemRepository 注入到控制器的构造函数中
public MyController(IItemRepository itemRepository)
{
_itemRepository = itemRepository;
}
当我完成存储库后,我应该如何处置工作单元?因为我不必 创建一个工作单元并将其包装在 using 语句中。我这样做正确吗?在我的情况下,将 DI 与 UoW 和 repo 模式应用的正确方法应该是什么?谢谢。
【问题讨论】:
-
我认为您可以通过仔细控制所涉及的所有内容的生命周期来解决它。我说它必须是每个请求的生命周期,但从有限的经验来看,生命周期并不总是他们看起来/声称要提供的。
标签: c# asp.net-mvc dependency-injection repository simple-injector