如果在控制器构建时未知存储库,如何在控制器中注入存储库?

时间:2014-03-16 21:44:31

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

我有一个应用程序,我不知道控制器可能需要的完整存储库列表(在构建控制器时)。控制器从数据库中获取要呈现的“组件”列表,然后需要哪些其他存储库取决于数据库返回的“组件”。有没有办法注入这些存储库?我正在使用ninject,虽然它可能没关系。

2 个答案:

答案 0 :(得分:1)

使您的存储库成为组件中的依赖项。大多数IOC软件(如Ninject)会在解析对象时为其注入所有必需的依赖项。

例如:

public class ComponentA : IComponent
{
    public IRepository RepositoryA {get;set;}
}

public class ComponentB : IComponent
{
    public IRepository RepositoryAnother {get;set;}
}

每当你加载ComponentA或B时,它的依赖项(在这种情况下是一个IRepository)也应该被加载。

所以你不需要知道需要什么样的存储库。

答案 1 :(得分:0)

在我写我的问题时,我的“组件”被实现为部分视图,我从一个控制器动作执行的视图(Html.Partial)中渲染它们。感谢this question and answer我更改了这个模型,以便我的每个“组件”都拥有自己的控制器,而不是直接渲染局部视图,从视图中调用在这些控制器上标记为ChildActionOnly的操作(Html 。行动)。这与article linked in the original answer中描述的类似,尽管在我的例子中视图引擎是剃刀。

这样整个问题就不再存在了 - 每个组件控制器现在都知道它的存储库。