3

我目前面临对象异步初始化的问题(this question)。我正在使用 Ninject 3.0.1.10,我想实现以下目标:

Kernel.Bind<IServiceProvider>().ToMethod(async ctx => await ServiceProvider.CreateAsync())

现在这个东西没有编译,因为异步 lambda 表达式返回 a Task<ServiceProvider>,而不是 a ServiceProvider。有没有办法在 Ninject 中异步初始化对象?也许一些解决方法?

4

1 回答 1

0

根据您的要求,我发布了一个使用 ninject 的解决方案。我稍微偏离了你的目标,因为构造函数没有执行初始化,但方法是。该方法由拦截器调用。Async-Ctor 最有可能通过更改为“没有目标的接口代理”(参见http://docs.castleproject.org/Tools.Kinds-of-proxy-objects.ashx)并让拦截器实例化对象。

我还想说,我相信异步初始化可能会带来比好处更多的缺点。例如,处理初始化异常会很困难,因为对接口的任何调用都可能导致初始化异常。

Castle Dynamic Proxy + Interceptor 初始化目标异步

IFoo必然InterceptingProxyProvider : IProvider。提供者实例化Foo所有拦截器Foo,然后创建并返回城堡动态代理 ( Proxy)。这是注入Caller时收到的内容。IFoo在它的构造函数中AsyncInitializationInterceptor开始初始化。Foo在第一次拦截调用时,它等待初始化完成,然后继续。如果初始化因异常而失败,则所有进一步的访问都IFoo将导致引发初始化异常。

进一步说明,ninject 代理扩展为每个目标类型创建一个拦截器实例。但是,我们想要的是每个目标实例一个拦截器实例。这就是为什么我提供了代理和拦截器的绑定和实例化的自定义实现。

这是代码,包含集成测试,应该向您展示如何使用它:

于 2013-10-02T13:59:59.227 回答