我正在使用ado - cribbed from jgauffin
的工作单元和存储库模式我也在尝试使用DI(ninject),但我很难明确如何处理存储库和UoW的安全处理以及如何实例化(范围等)
public interface IUnitOfWork : IDisposable{
void SaveChanges();
SqlCommand CreateCommand();
}
public IItemRepository{
List<Item> GetForParent(int parentID);
Item GetById(int id);
bool Update(Item item);
}
没有DI我会这样使用它,没有控制器的特殊构造函数:
public IHttpActionResult UpdateItem(Item item){
if(!ModelState.IsValid) return BadRequest(ModelState);
using (var uow = UnitOfWorkFactory.Create())
{
var repo = new ItemRepository(uow);
if (repo.GetByID(item.ID) == null) return NotFound();
if (!repo.Update(item)) return BadRequest("Unable to update Item");
uow.SaveChanges();
return Ok();
}
}
我正确地假设我应该执行以下操作,因为要进行保存我需要uow,即使它已经注入到存储库构造函数public ItemRepository(IUnitOfWork uow){_unitOfWork = uow;}
控制器也需要它..
IItemRepository _repo;
IUnitOfWork _uow;
public ItemController(IItemRepository repo, IUnitOfWork uow)
{
_repo = repo;
_uow = uow;
}
public IHttpActionResult UpdateItem(Item item){
if(!ModelState.IsValid) return BadRequest(ModelState);
if (_repo.GetByID(item.ID) == null) return NotFound();
if (_repo.Update(item)){
_uow.SaveChanges();
return Ok();
}
return BadRequest("Unable to update item");
}
并确保ninject创建具有正确范围的单元工作
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
kernel.Bind<IItemRepository>().To<ItemRepository>();
我明白这可能不是一起设置UoW和存储库的正确方法,并欢迎任何建议
答案 0 :(得分:0)
在我已经看到的其他实现中,UoW有访问各个存储库的方法,因此您将使用_uow.ItemRepository
(或_uow.Repository<MyItem>
或某些)来获取存储库。这基本上就是EF的作用:UoW是DbContext
,它暴露了DbSet
,类似于存储库。
因此,对于DI,您注入了您的UoW而不是存储库。 (或者您注入一个UoW 工厂,您可以直接创建UoW,如using (var uow = _uowFactory.Create())...