【问题标题】:Inversion of control for your Inversion of control container?为您的控制反转容器反转控制?
【发布时间】:2026-02-03 21:20:06
【问题描述】:

我最近不得不将使用 Ninject 1.0 的相对较大的控件库更新到 Ninject 2.0,以帮助解决我在 1.0 中遇到的一些问题。更新进展顺利,我觉得 Ninject 2.0 快了很多。

但是,为了避免以后出现这个问题,我创建了自己的接口来注入字段和属性(这实际上将调用我希望在当前 Web 应用程序中使用的 IOC 容器上的方法)。所以现在我的控制库独立于任何特定的 IOC 容器,这将加速未来该领域的任何变化。

我想知道有没有其他人做过同样的事情?

我对它所取得的成就感到满意,但理想情况下我想更新它。在我的控件中,我通常将这些注入字段创建为受保护的,并将它们设置在该控件的构造函数中。

IBlogService _blogService = null;
IEmailService _emailService = null;

public Templates_BlogTemplate()
{
    Inject(ref _blogService);
    Inject(ref _emailService);
}

我遇到的问题是我必须在所有对象上使用“ref”来实际设置属性,而我不能直接在属性上使用它。

我更愿意按照这些思路做一些事情,但我认为这是不可能的。

IBlogService _blogService = null;
IEmailService _emailService = null;

public Templates_BlogTemplate()
{
    Inject(_blogService, _emailService);
}

有没有人知道如何整理代码或使其以更简洁的方式工作?我还想避免使用属性,因此它会迫使开发人员决定在控件中的某个点注入变量。

欢迎所有想法和感受。

谢谢

【问题讨论】:

  • 我认为无法访问用户控件的构造(无法更改构造函数的调用方式)是 ASP.NET 用户控件令人讨厌的事情之一。抱歉,我没有任何有用的答案。

标签: c# asp.net ioc-container ninject


【解决方案1】:

支持属性注入,将依赖注入到“this”。

在我的例子中,我有一个调用 StructureMap.BuildUp(this) 的基类,并且用户控件将具有如下属性:

public IBlogService _blogService{get;set;}
public IEmailService _emailService{get;set;}

我拥有的唯一特定于结构图的行是在基类中。如果 ninject 允许你这样做,那么你可以调用你的代码将控件实例交给它,并让它根据其配置注入属性。

【讨论】:

    【解决方案2】:

    您可能想查看IServiceLocator 所描述的Glenn Block

    它是一个共享接口,可用于利用 IoC 而无需对容器产生硬依赖。

    【讨论】: