2010-06-10 71 views
2

有没有使用IoC,MEF [Imports]或另一个DI解决方案在对象创建时而不是在组合时间期间编写依赖关系的方法?IoC - 对象实例的动态组合

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

我认为这可能是一个可怕的设计(我正在处理一个遗留系统)这样做是因为对象创建,依赖注入等的开销......但我想知道是否有可能使用一个突发的IoC技术。

也许我有一些术语混合起来,但我的目标是避免写了一个框架对象的实例为“钩出来的事件”,并使用类似MEF为[出口]处理程序(依赖),其坚持一个非常具体的接口和[ImportMany]他们到一个对象实例,所以我的出口被调用,如果应用程序启动时程序集在那里。所以也许所有的对象仍然可以在应用程序启动时组成,但我希望系统在创建和销毁对象时查找并调用所有对象。

回答

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。

+0

一些DI容器也支持为您生成工厂。你可以注射例如Func -delegate。 DI容器然后为IWidget实例生成一个工厂。 例如在Autofac中:http://nblumhardt.com/2010/01/the-relationship-zoo/ – Gamlor 2010-06-13 21:53:30

+0

我很好奇,您是否需要将此工厂注入想要在第一个对象中创建对象的类地点?或者这是否需要实例化? – stuartmclark 2013-02-06 13:58:52

+1

@stuartmclark:你注入工厂。这就是为什么它是'IWidgetFactory'而不是某种具体类型。几个IoC容器实际上能够自动生成工厂,所以你甚至不需要上述类型,你可以注入'Func '或'Lazy '。 – Aaronaught 2013-02-07 01:15:58