我目前遇到了对象异步初始化问题(this question)。我正在使用Ninject 3.0.1.10,我希望实现以下目标:
Kernel.Bind<IServiceProvider>().ToMethod(async ctx => await ServiceProvider.CreateAsync())
现在这个东西没有编译,因为异步lambda表达式返回Task<ServiceProvider>
,而不是ServiceProvider
。有没有办法在Ninject中异步初始化对象?也许有些解决方法?
答案 0 :(得分:0)
根据您的要求,我发布了一个使用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代理扩展为每个目标类型创建一个拦截器实例。但是,我们想要的是每个目标实例一个拦截器实例。这就是为什么我提供了绑定和自定义的自定义实现。代理人的实例化拦截器。
以下是代码,包含集成测试,应该向您展示如何使用它: