IoC - 对象实例的动态组合

时间:2010-06-10 16:08:00

标签: .net dependency-injection ioc-container mef

有没有办法使用IoC,MEF [Imports]或其他DI解决方案在对象创建时而不是在合成时间内动态编写依赖关系?

这是我目前的想法。如果您有一个引发事件的对象实例,但您没有创建该对象一次并将其保存在内存中,则必须在每次创建对象时注册事件处理程序。据我所知,大多数IoC容器要求您注册组合中使用的所有类,并调用Compose()以使其挂钩所有依赖项。

我认为这可能是一个可怕的设计(我在这里处理遗留系统)由于对象创建,依赖注入等的开销而做到这一点......但我想知道是否有可能使用其中一个紧急的IoC技术。

也许我有一些混淆的术语,但我的目标是避免编写一个框架来“挂接一个对象的实例上的所有事件”,并使用像MEF这样的东西来连接[Export]处理程序(依赖项)到一个非常特定的接口和[ImportMany]它们到一个对象实例,所以如果应用程序启动时程序集在那里我的导出被调用。因此,当应用程序启动时,可能仍然可以组合所有对象,但我希望系统在创建和销毁对象时查找并调用所有对象。

1 个答案:

答案 0 :(得分:4)

通常,在DI / IoC环境中处理动态实例化的方式是使用抽象工厂。工厂是允许直接与容器交互的唯一类,以便在实例化新对象时解决依赖关系。

public interface IWidgetFactory
{
    IWidget CreateWidget(...);
}

public class MyIocWidgetFactory : IWidgetFactory
{
    private IoCContainer container;

    public MyIocWidgetFactory(IoCContainer container)
    {
        if (container == null)
            throw new ArgumentNullException("container");
        this.container = container;
    }

    public IWidget CreateWidget(...)
    {
        // Assumes that the container is configured to create transient objects
        // for IWidget, not a singleton.
        return container.Resolve<IWidget>();
    }
}

请不要将此与服务定位器反模式混淆;没有其他任何东西可以触及容器,只是工厂,它只会创建一种类型的对象。

此时,您只需将IWidgetFactory传递给在运行时创建窗口小部件的任何需要。就是这样 - 你维持了DI。