C# 我可以使用ToMethod为Ninject绑定使用异步方法吗?

C# 我可以使用ToMethod为Ninject绑定使用异步方法吗?,c#,windows-phone-8,ninject,C#,Windows Phone 8,Ninject,我目前面临对象()的异步初始化问题。我正在使用Ninject 3.0.1.10,我希望实现以下目标: Kernel.Bind<IServiceProvider>().ToMethod(async ctx => await ServiceProvider.CreateAsync()) Kernel.Bind().ToMethod(async ctx=>await ServiceProvider.CreateAsync()) 现在这个东西没有编译,因为异步lambda表达式返回

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

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

现在这个东西没有编译,因为异步lambda表达式返回一个
任务
,而不是
服务提供者
。有没有办法在Ninject中异步初始化对象?也许有一些解决办法?

根据您的要求,我发布了一个使用ninject的解决方案。 我稍微偏离了您的目标,因为构造函数没有执行初始化,而是执行了一个方法。该方法由拦截器调用。 异步Ctor最有可能的方法是更改为“无目标的接口代理”(请参阅),并让拦截器实例化对象

我还想说,我相信异步初始化可能弊大于利。例如,很难处理初始化异常,因为对接口的任何调用都可能导致初始化异常

IFoo
绑定到
InterceptingProxyProvider:IProvider
。提供程序实例化
Foo
Foo
的所有拦截器,然后创建并返回一个castle动态代理(
proxy
)。 这是
调用方在注入
IFoo
时接收的内容。
AsyncInitializationInterceptor
在其构造函数中启动
Foo
的初始化。 在第一次截获调用时,它会等待初始化完成,然后继续。 如果初始化失败并出现异常,则对
IFoo
的所有进一步访问将导致引发初始化异常

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

以下是代码,包括集成测试,这些测试将向您展示如何使用它:


您是否尝试了
任务。等待(/*…*/)
?然后它将是同步的。。。但你是对的,这种异步必须在某个地方表现出来。我想,Kernel.Get()也应该是异步的。在Ninject中可能吗?有两种方法可以将注入和IServiceProvider的实例化解耦。第一个是:注入懒惰。ninject支持这一点,但这意味着IServiceProvider消费者随后会知道这一点。第二种方法是将IServiceProvider绑定到接口的代理上,其中代理上的第一个调用必须检索实际实例(或者再次在延迟代理上执行)。但是,请注意,ninject默认情况下会为每个类型而不是每个实例创建代理。我有一个工作要做。如果您想让我发布完整的解决方案,请告诉我。@BatteryBackupUnit是的,请发布您的解决方案。我想,一些变通方法不会有什么坏处,因为这个问题还没有答案。有人能用代码发布答案吗?。我无法访问这两个URL,我真的希望使用ninject的异步库。我可以将它们添加到答案中,但这意味着您必须将大量文件添加到解决方案/c#项目中。相反,我也可以将它上传到另一个文件宿主——以防有一个你可以访问?请让我知道。在这种情况下,也许github回购协议是最好的?。大多数文件共享站点在这里都被它阻止了,但是github是可以的。谢谢你的回复。我也主要是在看了粗略的实现之后。如果是一大堆文件,可能是一个github repo/nuget包:)@user1570690 github repo现在可用: