2011-10-02 95 views
0

有没有办法确定Autofac何时完成实例的初始化? 如果您有懒惰依赖项,或者您通过属性注入依赖项,则可能需要它。autofac实例初始化通知

可能的解决办法是这样的:

public class Component : IKeepMeInformed { 
    private readonly IOtherComponent otherComponent; 

    public class Component(Lazy<IOtherComponent> otherComponent) { 
     this.otherComponent = otherComponent; 
    } 

    void IKeepMeInformed.InitializationCompleted() { 
     // Do whatever you need with this.otherComponent.Value 
    } 
} 

回答

1

不直接依赖于懒惰的成分,但Autofac公开事件,可以让你挂接到实例的生命周期。在创建实例后,倾听the OnActivated event将使您能够立即做些事情。例如: -

builder.RegisterType<OtherComponentImplementation>().As<IOtherComponent>() 
    .OnActivated(e => InitializationCompleted(e.Instance)); 

更新:其实,在你Component类的情况下,你应该“知道”时,初始化实例。无论何时您首先访问Lazy<>.Value属性。

+0

谢谢。我知道有这样的机制。我不喜欢更改每个组件的注册详细信息,这需要进行初始化。因此,我想要基于接口的解决方案。 –

+0

确切的情况是这样的:component(ICommand)取另一个组件(ViewModel)并订阅它的PropertyChanged事件。当然,命令一旦可用就应该订阅事件,这通常是在构造函数中完成的。在我的情况下,是循环依赖,并且ViewModel在构造函数中不可用。因此,我希望Autofac在其构建完成时通知组件。 –

+0

但是,您的命令实例的生命周期是否也由ViewModel控制?例如在VM构造函数中创建?或者你是否设想通过容器以某种方式创建命令? –