我可以使用ToMethod对Ninject绑定使用异步方法吗?

时间:2013-04-10 10:59:18

标签: c# windows-phone-8 ninject

我目前遇到了对象异步初始化问题(this question)。我正在使用Ninject 3.0.1.10,我希望实现以下目标:

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

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

1 个答案:

答案 0 :(得分:0)

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

我还想说,我相信异步初始化可能会提供更多的缺点而不是好处。例如,处理初始化异常将很困难,因为接口上的任何调用都可能导致初始化异常。

Castle Dynamic Proxy + Interceptor which initializes target async

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

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

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