C# 什么是通用存储库或工作单元的正确实现,哪些应该与EF一起使用?
我已经实现了一个通用的C# 什么是通用存储库或工作单元的正确实现,哪些应该与EF一起使用?,c#,generics,repository-pattern,entity-framework-6,unit-of-work,C#,Generics,Repository Pattern,Entity Framework 6,Unit Of Work,我已经实现了一个通用的存储库和UnitOfWorkfound 我的服务器端堆栈是:C#Net 4.5、EF6、AutoMapper(用于EF模型/DTO)、Autofac(DI)、WebAPI、OData 我的DI设置如下所示: var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterApiControllers(Ass
存储库
和UnitOfWork
found
我的服务器端堆栈是:C#Net 4.5、EF6、AutoMapper(用于EF模型/DTO)、Autofac(DI)、WebAPI、OData
我的DI设置如下所示:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); // using extension to register all controllers in an assembly at once
builder.RegisterType<ProjectV001Context>().As<IDataContext>().InstancePerHttpRequest();
builder.RegisterType<Repository<ContentType>>().As<IRepository<ContentType>>().InstancePerHttpRequest();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest();
builder.RegisterType<ContentTypesController>().As<IContentTypesController>().InstancePerHttpRequest();
var container = builder.Build();
private readonly IUnitOfWork _uow;
public ContentTypesController(IUnitOfWork unitOfWork)
{
_uow = unitOfWork;
}
关于是否进一步抽象EF的db上下文一直存在争议,@qujck指出
…拥有自己对UnitOfWork和Repository的抽象可以
模拟单元测试时的最大控制和灵活性
一切都很好,但对我来说,这些抽象的真正力量是
它们提供了一种应用面向方面编程的简单方法
技术和坚持扎实的原则
我重新编写了这个问题,以包含最初的意图:在第一个示例中,我使用一个通用存储库,为每种类型创建一个特定的存储库,在本例中为ContentTypes
所以只要接受我使用的是通用框架。。。查看引导设置:
builder.RegisterType<Repository<ContentType>>().As<IRepository<ContentType>>().InstancePerHttpRequest();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest();
builder.RegisterType<ContentTypesController>().As<IContentTypesController>().InstancePerHttpRequest();
实施:
try
{
var result = options.ApplyTo(_uow.Repository<ContentType>().Query().Get()
.Where(u => u.UserId == userId)
.OrderBy(o => o.Description)).Cast<ContentType>();
IQueryable<ContentTypes> dto = result.Project().To<ContentTypes>();
return dto;
}
catch (Exception ex)
{
throw ex;
}
此实现是否正确(我是否应该使用
存储库
而不是uow
),最好使用工作单元
或存储库
实现,如何确保我使用DI框架来实现这个UnitOfWork
实现?您的控制器应该通过构造函数获得uow。你有什么问题?@WiktorZychla-我忘了添加实现-现在就在那里。我个人反对像这样一层一层地添加。不必要的复杂化是编码的最大弊端之一,很容易说服自己去做,但却会给完成实际工作带来真正的痛苦。EF的目的就是让它变得更简单,代码更干净,同时又能给你尽可能多的灵活性。@ElHaix:看起来还可以。如果您的工作单元被注入,那么您不必在构造函数中处理它,因为处理将在请求管道的末尾在外部完成。
using (var unitOfWork = new Repository.UnitOfWork(_db))
{
var userId = 102; // mock
var result = options.ApplyTo(unitOfWork.Repository<ContentType>().Query().Get()
.Where(u => u.UserId == userId)
.OrderBy(o => o.Description)).Cast<ContentType>();
var dto = Mapper.Map<IEnumerable<ContentType>, IEnumerable<ContentTypes>>(result);
return dto;
}
private readonly IUnitOfWork _uow;
public ContentTypesController(IUnitOfWork unitOfWork)
{
_uow = unitOfWork;
}
try
{
var result = options.ApplyTo(_uow.Repository<ContentType>().Query().Get()
.Where(u => u.UserId == userId)
.OrderBy(o => o.Description)).Cast<ContentType>();
IQueryable<ContentTypes> dto = result.Project().To<ContentTypes>();
return dto;
}
catch (Exception ex)
{
throw ex;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_db.Dispose();
}
base.Dispose(disposing);
}