【问题标题】:ASP.NET MVC Controller with multiple repositories?具有多个存储库的 ASP.NET MVC 控制器?
【发布时间】:2011-04-13 13:40:14
【问题描述】:

我有一个视图,我正在我的数据库中搜索一个对象(即书籍)..

此视图的控制器依赖于实现搜索方法的 BooksRepository。

一切正常。我还可以选择进行高级搜索,在模态弹出窗口中显示更大的表单。此表单有许多字段,包括用于选择“作者”进行搜索的下拉框。

我想在我的视图模型中传递authors 的列表,所以在我的控制器中我实例化了我的视图模型的一个实例,我需要调用存储库方法来恢复authors 的列表。 .

我的想法是这个 GetAuthors() 方法应该在 AuthorRepository...

将多个 repo 注入控制器是不好的做法吗?或者我应该有一个作者控制器,注入作者回购......并从我的 BookSearch 控制器调用作者控制器中的方法?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    我认为在一个控制器中引用多个存储库是非常好的。控制器的工作是将数据包装在模型中并将其传递给视图,而不管它如何获取数据。进行跨控制器调用可能会变得混乱。

    【讨论】:

    • 是的,再想一想,交叉控制器的想法似乎并不那么好。
    【解决方案2】:

    我认为将您需要的两个存储库注入控制器并不是一个坏主意。实际上,这听起来是个好习惯。

    但是,如果您觉得事情失控了,您可能想要创建一个应用程序服务来编排一个功能,您可以在其中注入多个存储库。这也是一种将逻辑从控制器中移开的方法。

    但在这种情况下,我认为你做得对。

    阅读本书:http://www.infoq.com/minibooks/domain-driven-design-quickly

    【讨论】:

      【解决方案3】:

      就我个人而言,我认为书籍和作者是非常具体的实体......除非您打算让作者也写一首歌,并且您想要拥有一个音乐库和一个书籍库,否则我会可能将作者和书籍保存在同一个存储库中,因为您很可能同时需要它们。

      即便如此,您也可以拥有一个音乐存储库和一个图书存储库,它们都从同一个作者表中提取。这没什么不好。不,在控制器中拥有多个存储库并不是“不行”,但除非您使用依赖注入,否则随着您添加更多存储库,它可能会开始变得棘手。

      【讨论】:

      • 哦,他们真的不是 BooksAuthors 这只是为了举例,在我的真实情况下,他们需要在单独的仓库中
      • 这会违反 DDD 的根聚合规则。作者!=书籍。埃里克·埃文斯不喜欢这样。
      • 看看这本书:infoq.com/minibooks/domain-driven-design-quickly 这是一本晚上阅读的书,涵盖了大部分基础知识。
      【解决方案4】:

      我有一些控制器引用了多个存储库。如果您的每个存储库都实例化自己的数据上下文(或 EF ObjectContext),请小心。就实体框架而言,如果您开始使用两个开放上下文导航实体引用,您将遇到问题。

      除此之外,它对我来说很好用。

      【讨论】:

        【解决方案5】:

        从建筑师的角度来看。

        如果您觉得您的 mvc 控制器因依赖关系而失控,那么是时候考虑两件事了。

        1. 查看设计并确定是否需要外观类来表示复杂的子系统,此外它更适合单元测试(有 4 层应用程序之类的东西)

        2. 查看其他一些可以帮助解决此问题的其他设计模式(可能是 DI 策略,访问者)

        另外,我敢打赌,在这种情况下,单元测试会更痛苦,如果您不能以简单的方式对其进行单元测试,则应该将其标记为待改进

        祝你好运,

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-13
          • 1970-01-01
          • 2018-10-25
          • 1970-01-01
          • 2016-06-21
          • 2010-12-01
          • 1970-01-01
          • 2011-02-07
          相关资源
          最近更新 更多