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

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>

有什么想法吗?

我完成了绑定同步

kernel.Bind<MyInterface>().ToMethod(ctx =>
{
   var someData = DoSomethingSync(); // <-- Made this one sync, see method below
   return new SomethingElse(someData);
}).InRequestScope();

这里是'magic'。我改变了我的方法:

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

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

你的对象图的构造应该是reliable and fast。这不包括做任何与 I/O 相关的事情。这意味着您应该做任何异步的事情根本

相反,任何缓慢、不可靠或异步的事情都应该推迟到 构建对象图之后。