当控制器构造时不知道存储库时,如何在控制器中注入存储库

本文关键字:存储 控制器 注入 不知道 | 更新日期: 2023-09-27 17:50:28

我有一个应用程序,其中我不知道控制器可能需要的存储库的完整列表(在构造控制器时)。控制器从数据库获取要呈现的"组件"列表,然后需要哪些额外的存储库取决于数据库返回的"组件"。是否有办法注入这些存储库?我用的是ninject,不过可能不重要

当控制器构造时不知道存储库时,如何在控制器中注入存储库

使您的存储库成为组件中的依赖项。大多数像Ninject这样的IOC软件在解析对象时都会为它注入所有必需的依赖项。

例如:

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

当你加载ComponentA或B时,它的依赖项(在本例中是IRepository)也应该被加载。

所以你不需要知道Repository是什么

在我写问题的时候,我的"组件"是作为局部视图实现的,我从控制器动作执行的视图(Html.Partial)中呈现它们。由于这个问题和答案,我改变了这个模型,所以我的每个"组件"都有它自己的控制器,而不是直接呈现部分视图,这些控制器上标记为ChildActionOnly的动作从视图中调用(Html.Action)。这与原始答案中链接的文章中描述的类似,尽管在我的例子中,视图引擎是razor。

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