【问题标题】:MVC Repository Pattern - Accessing other Repositories [closed]MVC 存储库模式 - 访问其他存储库 [关闭]
【发布时间】:2023-03-27 20:04:01
【问题描述】:
我有一个存储库,内部(在某些方法上)需要使用另一个存储库。
我试图将所有依赖项都放在构造函数上,将接口作为参数传递。但是我不知道如何处理这种特定情况。
我是否也应该将这个 repository 作为参数传递?即使我不会在里面的每个方法上都使用它?
谢谢
【问题讨论】:
标签:
asp.net-mvc
asp.net-mvc-4
dependency-injection
repository-pattern
【解决方案1】:
使存储库依赖于另一个存储库没有任何问题。而且,是的,将其作为参数传递
我假设您正在进行依赖注入,特别是构造函数注入。
实例化一个额外的存储库,有时不会使用它(因为并非所有方法都使用它)它并不是一个可怕的开销,让你避免它。如果它是一种更昂贵的资源(例如打开文件或数据库连接),您可以使用一些替代技术。例如,在具有支持字段的属性中公开第二个存储库,该支持字段在使用服务位置对属性 getter 的第一次调用中填充,即直接在容器中找到它,或者提供更智能的解决方案,但提供了一些 DI 框架,其中自动做这种事情,like Unity's Lazy and similar solutions。
但我坚持认为,在这种情况下,开销并不能证明它是合理的。
注意:如果你有一个依赖循环(循环依赖),你也可以使用属性或惰性技术来打破循环并使其工作。但是,在这种情况下,最好重构类(提取第三个类)以避免循环引用。这不是你的情况。
【解决方案2】:
我可能会在存储库之上创建一个服务层。将两个存储库都注入服务层。
public LibraryCatalogueService {
IBookRepository _books;
IAuthorsRepository _authors;
public LibraryCatalogueService (IBookRepository books, IAuthorRepository authors)
{
_books = books;
_authors = authors;
}
public List<BookWithAuthor> GetBooksWithAuthors()
{
//do stuff to get books and get authors and then join them.
//return the list
}
}