【发布时间】:2014-04-22 00:21:09
【问题描述】:
我有一个应用程序,但我不知道控制器可能需要预先存储的完整存储库列表(在构造控制器时)。控制器从数据库中获取要呈现的“组件”列表,然后需要哪些额外的存储库取决于数据库返回的“组件”。有没有办法注入这些存储库?我正在使用 ninject,尽管它可能无关紧要。
【问题讨论】:
标签: c# asp.net .net asp.net-mvc asp.net-mvc-5
我有一个应用程序,但我不知道控制器可能需要预先存储的完整存储库列表(在构造控制器时)。控制器从数据库中获取要呈现的“组件”列表,然后需要哪些额外的存储库取决于数据库返回的“组件”。有没有办法注入这些存储库?我正在使用 ninject,尽管它可能无关紧要。
【问题讨论】:
标签: c# asp.net .net asp.net-mvc asp.net-mvc-5
使您的存储库成为组件中的依赖项。大多数 IOC 软件(如 Ninject)会在您解析对象时为其注入所有必需的依赖项。
例如:
public class ComponentA : IComponent
{
public IRepository RepositoryA {get;set;}
}
public class ComponentB : IComponent
{
public IRepository RepositoryAnother {get;set;}
}
每当您加载 ComponentA 或 B 时,它的依赖项(在本例中为 IRepository)也应该被加载。
所以您不需要知道需要什么存储库。
【讨论】:
在我写我的问题时,我的“组件”被实现为部分视图,我从控制器操作执行的视图 (Html.Partial) 中呈现它们。感谢this question and answer,我更改了这个模型,所以我的每个“组件”都有自己的控制器,而不是直接渲染部分视图,这些控制器上标有ChildActionOnly 的动作是从视图中调用的(Html.Action)。这与article linked in the original answer 中描述的类似,但在我的情况下,视图引擎是剃刀。
这样整个问题就不再存在了——每个组件控制器现在都知道它的存储库了。
【讨论】: