使用Ninject与UnitOfWork和Repository(ADO而非EF)

本文关键字:ADO 而非 EF Repository Ninject UnitOfWork 使用 | 更新日期: 2023-09-27 18:19:32

我正在使用一个从jgaufin 中抄袭的工作单元和存储库模式

我也在尝试使用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和存储库的正确方式,并欢迎

使用Ninject与UnitOfWork和Repository(ADO而非EF)

的任何建议

在我看到的其他实现中,UoW有访问各个存储库的方法,因此您可以使用_uow.ItemRepository(或_uow.Repository<MyItem>或类似的方法)获得存储库。EF本质上就是这样做的:UoW是DbContext,它公开类似于存储库的DbSet

因此,对于DI,您可以注入您的UoW,但不注入存储库。(或者,您可以注入一个UoW工厂,从中直接创建UoW,如using (var uow = _uowFactory.Create())...