【问题标题】:How to inject a repository in a controller when repository is not known at controller construction time?如果在控制器构建时不知道存储库,如何在控制器中注入存储库?
【发布时间】:2014-04-22 00:21:09
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    例如:

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

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

    所以您不需要知道需要什么存储库。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多