【问题标题】:Correct use of Repository and Unit Of Work patterns in ASP.NET MVC在 ASP.NET MVC 中正确使用 Repository 和 Unit Of Work 模式
【发布时间】:2014-09-22 15:30:10
【问题描述】:

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

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

当我尝试在我的控制器中使用存储库时,我没有得到任何返回。我怀疑这是因为没有任何东西专门链接或注入 EFDbContext 并且似乎无法弄清楚如何做到这一点。

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

【问题讨论】:

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


【解决方案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>();

当然,这完全否定了对工作单元的需求。

我不一定会推荐这种方法的原因是它没有经过现场测试。正如我所说,我个人已经玩弄了一点,我自己也觉得很舒服。不过,我很想听听其他开发人员对这种方法的看法。

【讨论】:

  • 谢谢 - 我实际上从这篇文章 asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/… 中得到了我想要的工作。它与我试图实现的目标非常相似。我将看一下服务层的这个概念,而不是使用存储库和 Uow 模式。你说的很有道理。我对这一切都很陌生,所以必须花一些时间来了解它。
  • 我们已经使用这种方法好几年了,而且效果很好。但是,在 NHibernate 中,我们还使用了两个接口,而不仅仅是一个:IUnitOfWork,用于Start()(开始事务)、Commit()Rollback(),以及IRepository,它具有@ 等方法987654336@, Save&lt;T&gt;(id), Delete&lt;T&gt;(id), ExecuteQuery&lt;TResult&gt;(IQuery).
  • @ChrisPratt var foos = repo.GetAll&lt;Foo&gt;(); 每次我想要一个 Foo 回购时,这不会创建一个新的 Foo 吗?我们是否应该使用一个工作单元来为每个数据库模型实例化一个存储库,如 OP 共享的博客中所描述的那样?
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多