我正在使用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>
。
有什么想法吗?
答案 0 :(得分:3)
对象图的构造应为reliable and fast。这排除了做与I / O相关的任何事情。这意味着你不做任何异步 的事情。
相反,任何缓慢,不可靠或异步的内容都应该在构建对象图之后推迟到。
答案 1 :(得分:0)
我最终进行了绑定同步
kernel.Bind<MyInterface>().ToMethod(ctx =>
{
var someData = DoSomethingSync(); // <-- Made this one sync, see method below
return new SomethingElse(someData);
}).InRequestScope();
这是魔法&#39;。我改变了我的方法:
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;
}
我知道由于上下文切换会影响性能,但至少它会按预期工作,您可以确定它不会死锁。