Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是通用存储库或工作单元的正确实现,哪些应该与EF一起使用?_C#_Generics_Repository Pattern_Entity Framework 6_Unit Of Work - Fatal编程技术网

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);
    }