2

我有一个仓库内部(在某些方法上)将需要使用另一个仓库MVC仓库模式 - 访问其他仓库

我想把所有依赖关系的构造函数,传递接口作为参数。但是我不知道如何处理这个特定的场景。

我是否也应该通过这个版本库作为参数?即使我不会在每个方法里面使用它?

感谢

+0

你也使用工作单位吗? – SOfanatic

+0

这样的问题应该可以进入http://programmers.stackexchange.com/ – solidau

回答

2

对于使存储库依赖于另一个存储库,您没有任何问题。是的,通过它作为参数

我假设你正在进行依赖注入,特别是构造函数注入。

实例化一个额外的存储库,有时不会使用(因为并非所有的方法都使用它),它并不是一个如此可怕的开销,使您避免它。如果它是一个更昂贵的资源(如打开一个文件或数据库连接),你可以使用一些替代技术。例如,将第二个存储库暴露在一个属性中,该属性的第一个调用是使用服务位置填充到属性getter中,即直接在容器中找到它,或者提供更智能的解决方案,但提供了一些DI框架,自动完成这种事情,like Unity's Lazy and similar solutions

但我坚持,在这种情况下,开销并不合理。

注意:如果你有一个依赖循环(循环依赖),你也可以使用属性或Lazy技术来打破循环并使其工作。但是,在这种情况下,重构类(提取第三个类)避免循环引用会好得多。这不是你的情况。

1

我很可能会令在仓库顶部的服务层。将两个存储库注入服务层。

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 
    } 
}