根据您的要求,我发布了一个使用 ninject 的解决方案。我稍微偏离了你的目标,因为构造函数没有执行初始化,但方法是。该方法由拦截器调用。Async-Ctor 最有可能通过更改为“没有目标的接口代理”(参见http://docs.castleproject.org/Tools.Kinds-of-proxy-objects.ashx)并让拦截器实例化对象。
我还想说,我相信异步初始化可能会带来比好处更多的缺点。例如,处理初始化异常会很困难,因为对接口的任何调用都可能导致初始化异常。
IFoo
必然InterceptingProxyProvider : IProvider
。提供者实例化Foo
所有拦截器Foo
,然后创建并返回城堡动态代理 ( Proxy
)。这是注入Caller
时收到的内容。IFoo
在它的构造函数中AsyncInitializationInterceptor
开始初始化。Foo
在第一次拦截调用时,它等待初始化完成,然后继续。如果初始化因异常而失败,则所有进一步的访问都IFoo
将导致引发初始化异常。
进一步说明,ninject 代理扩展为每个目标类型创建一个拦截器实例。但是,我们想要的是每个目标实例一个拦截器实例。这就是为什么我提供了代理和拦截器的绑定和实例化的自定义实现。
这是代码,包含集成测试,应该向您展示如何使用它: