在ASP.NET MVC中正确使用存储库和工作单元模式

时间:2014-09-22 15:30:11

标签: c# asp.net-mvc ninject unit-of-work

我一直在尝试使用Ninject的工作单元和依赖注入在MVC中实现通用存储库。

我一直关注的帖子就是这个 http://codefizzle.wordpress.com/author/darkey69/

当我尝试在控制器中使用存储库时,我没有收到任何返回。我怀疑这是因为没有任何特定的链接或注入EFDbContext,似乎无法解决如何做到这一点。

如果有人实施了这一点并且可以提供帮助,那将非常感激。我不会重新发布我的代码,因为它已全部包含在上面的帖子中并进行了解释。

1 个答案:

答案 0 :(得分:1)

虽然最终I would discourage you from using the UoW/Repository patterns with an ORM like Entity Framework,我仍然可以给你一个我玩弄过的方法,即使在更适合抽象你的上下文的东西,比如服务,这可能会有所帮助。

您发布的所有链接都在使用泛型,因此您不必为每个特定实体类型实际定义IRepository的单独实现。但是,您仍然必须为IUnitOfWork实现中的每个实体类型手动新建通用存储库的实例,并且更改接口本身以包含每个实体的存储库实例(如果您)希望实际上能够使用接口而不是实际的通用实例。这不仅麻烦,而且还违反UnitOfWork<T>IUnitOfWork上的开放式关闭,并且保持与变化同步也会带来很多乐趣(阅读:讽刺)。

我玩过的另一种选择,虽然我不会推荐推荐,但是使用泛型方法而不是泛型类。例如,而不是像:

public class Repository<T> : IRepository<T>
    where T : class
{
    ...

    public IEnumerable<T> GetAll()
    {
        return _dbSet;
    }
}

您可以这样做:

public class Repository : IRepository
{
    ...

    public IEnumerable<T> GetAll<T>()
        where T : class
    {
        return context.Set<T>();
    }
}

这意味着,您只需要新建一个Repository实例,然后您就可以访问上下文中的任何实体类型:

var repo = new Repository(context);
var foos = repo.GetAll<Foo>();
var bars = repo.GetAll<Bar>();

当然,这完全否定了对一个单位工作的需要。

我不能推荐这种方法的原因是它没有经过现场测试。就像我说的那样,我个人玩弄了一下,我自己也觉得很舒服。但是,我非常有兴趣听听其他开发人员对这种方法的看法。