ASP.NET MVC控制器与多个存储库

本文关键字:存储 NET MVC 控制器 ASP | 更新日期: 2023-09-27 17:49:43

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

这个视图的控制器依赖于一个BooksRepository,它实现了一个搜索方法。

一切正常。我还可以选择做一个高级搜索,在一个模态弹出框中呈现一个更大的表单。此表单有许多字段,包括一个下拉框,用于选择要搜索的"作者"。

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

我的想法是,这个GetAuthors()方法应该在AuthorRepository中…

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

ASP.NET MVC控制器与多个存储库

我认为在控制器中引用多个存储库是完全可以的。控制器的工作是将数据封装在模型中,并将其传递给视图,而不管它如何获得数据。跨控制器调用可能会很混乱。

我认为将需要的两个存储库注入控制器不是一个坏主意。事实上,这听起来像是一个很好的实践。

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

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

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

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

即使这样,您也可以有一个音乐存储库和一个图书存储库,它们都是从同一个作者表中提取的。这没什么不对的。不,在一个控制器中有多个存储库并不是"不允许"的,但除非你使用依赖注入,否则当你添加更多存储库时,它会变得很麻烦。

我有几个控制器引用了多个存储库。如果您的每个存储库实例化了它们自己的数据上下文(或EF ObjectContext),请注意。就实体框架而言,如果你开始在两个开放的上下文中导航实体引用,你就会遇到问题。

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

从架构师的角度来看。

如果你觉得你的mvc控制器已经无法控制依赖关系,那么是时候考虑两件事了。

  1. 看一下设计,确定是否需要facade类来表示复杂的子系统,除此之外,它更适合单元测试(有这样的4层应用程序)

  2. 看一些其他的设计模式,可以帮助解决这个问题之前,它成为一个问题(策略与DI,访问者可能)

而且,我敢打赌在这种情况下,单元测试更痛苦,如果你不能以简单的方式进行单元测试,它应该被标记为改进

好运,