gpt4 book ai didi

c# - 我可以使用 ToMethod 将异步方法用于 Ninject 绑定(bind)吗?

转载 作者:行者123 更新时间:2023-11-30 18:34:36 24 4
gpt4 key购买 nike

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

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

现在这个东西无法编译,因为异步 lambda 表达式返回一个 Task<ServiceProvider> , 不是 ServiceProvider .有什么办法可以在 Ninject 中异步初始化对象吗?也许有一些解决方法?

最佳答案

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

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

Castle Dynamic Proxy + Interceptor which initializes target async

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

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

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

关于c# - 我可以使用 ToMethod 将异步方法用于 Ninject 绑定(bind)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com