【问题标题】:C# automatic creation of repositories by entity typeC# 按实体类型自动创建存储库
【发布时间】:2018-06-14 23:52:21
【问题描述】:

我找到了一个基于实体框架Generic Repository示例,并试图了解如何通过相同的接口和实体类型自动解析存储库。

上面的链接指向repo,您​​可以在其中看到以下方法:

public class HomeController : Controller
{
    private readonly ICategoryRepository _repository;

    public HomeController(ICategoryRepository repository)
    {
        _repository = repository;
    }

在这种情况下,我们必须创建一个单独的 CategoryRepository - 所以,repository 是每个类型的

这意味着我们最终会有很多用于存储库的类。

我想远离多个类并找到一种解决方法来处理将实体类型作为类型参数传递给接口的存储库

public class HomeController : Controller
{
    private readonly IRepository<Category> _repository;

    public HomeController(IRepository<Category> repository)
    {
        _repository = repository;
    }

我尝试用谷歌搜索解决方案,但在代码示例方面没有找到太多信息。

ASP.NET Boilerplate 框架有这个functionality,你可以从sources 看到。

我可以看到该文件夹​​中的接口文件,它们很有意义。

但它们的实现对我来说有点模糊,因为似乎有一些额外的代码可以处理自动 repo 创建。

【问题讨论】:

  • 如果您使用的是实体框架(给定标签),请考虑直接使用它并忘记通用存储库的东西。你已经有了它,它是 DbSet&lt;T&gt; 类。
  • 为什么要重新发明轮子?您已经在使用实体框架。它已经是具有 UoW 实现的通用存储库。
  • 你在问如何创建一个泛型类吗? dotnetperls.com/generic
  • @CamiloTerevinto 非常有趣,然后利用 EF 更有意义。真的非常感谢!
  • @AlexHerman 应该花一些时间来回顾一下weeklydevtips.com/024 的主题,这很有趣。

标签: c# entity-framework dependency-injection repository-pattern ioc-container


【解决方案1】:

如 cmets 所述,避免重新发明轮子。如果您使用任何完整的 ORM(此处为实体框架),它本身就可以用作存储库以及 UoW。因此,最推荐使用 ORM 本身内联并绕过存储库和 UoW。以下是一些不错的读物:

https://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

http://www.primaryobjects.com/2010/03/17/using-the-nhibernate-repository-pattern-in-c-asp-net/

但是,在某些情况下,您可能仍希望实现 Repository。这允许您在代码中注入存储库,使代码的其他部分可测试。即使在这种情况下,也要避免使用通用存储库。它被认为是anti-pattern

在这种情况下,为每个聚合根实现具体的存储库。避免使用通用存储库或仅将其用作所有具体存储库的基类。更多解释可以在 thisthisthis 答案中找到。

您链接的 GitHub 示例代码对于 Generic Base Repository 类来说看起来不错。请注意,它公开了IQueryable&lt;TEntity&gt; GetAll();。如果在基类中实现,这应该没问题。永远不要从您的具体存储库中返回 IQueryable。它违反了存储库模式的基本目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2013-06-29
    • 2011-01-22
    • 2012-08-21
    相关资源
    最近更新 更多