我一直在尝试使用Ninject的工作单元和依赖注入在MVC中实现通用存储库。
我一直关注的帖子就是这个 http://codefizzle.wordpress.com/author/darkey69/
当我尝试在控制器中使用存储库时,我没有收到任何返回。我怀疑这是因为没有任何特定的链接或注入EFDbContext,似乎无法解决如何做到这一点。
如果有人实施了这一点并且可以提供帮助,那将非常感激。我不会重新发布我的代码,因为它已全部包含在上面的帖子中并进行了解释。
答案 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>();
当然,这完全否定了对一个单位工作的需要。
我不能推荐这种方法的原因是它没有经过现场测试。就像我说的那样,我个人玩弄了一下,我自己也觉得很舒服。但是,我非常有兴趣听听其他开发人员对这种方法的看法。