0

我最近不得不将使用 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);
}

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

欢迎所有的想法和感受。

谢谢

4

2 回答 2

1

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

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

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

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

于 2009-04-01T04:41:26.630 回答
1

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

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

于 2009-04-01T13:49:47.360 回答