C#Ninject:如何绑定到方法异步

时间:2017-02-16 20:32:22

标签: c# async-await ninject

我正在使用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>

有什么想法吗?

2 个答案:

答案 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;
}

我知道由于上下文切换会影响性能,但至少它会按预期工作,您可以确定它不会死锁。