[英]C# Ninject: How to bind to method async
我正在使用Ninject 3.2.2.0,我正在尝试绑定异步方法。
这是我到目前为止所得到的:
kernel.Bind<Task<MyInterface>>().ToMethod(async ctx =>
{
var someData = await DoSomethingAsync();
return new SomethingElse(someData);
}).InRequestScope();
我的方法DoSomethingAsync
永远不会被调用。 我相信它没有被调用,因为正在请求MyInterface
,而不是Task<MyInterface>
。
有任何想法吗?
对象图的构造应该可靠且快速 。 这排除了做与I / O相关的任何事情。 这意味着,你不应该做任何是异步的 。
相反,任何缓慢,不可靠或异步的东西都应该在构建对象图之后推迟。
我最终使我的绑定同步
kernel.Bind<MyInterface>().ToMethod(ctx =>
{
var someData = DoSomethingSync(); // <-- Made this one sync, see method below
return new SomethingElse(someData);
}).InRequestScope();
这是'魔术'。 我改变了我的方法:
private async Task<string> DoSomethingAsync() {
var result = await DoSomethingElseAsync();
return result;
}
至
private string DoSomethingSync() {
string result = null;
var runSync = Task.Factory.StartNew(async () => {
result = await DoSomethingElseAsync();
}).Unwrap();
runSync.Wait();
return result;
}
我知道由于上下文切换,性能受到影响,但至少它按预期工作,你可以确定它不会死锁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.