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 相关的事情。这意味着您应该不做任何异步的事情根本。
相反,任何缓慢、不可靠或异步的事情都应该推迟到 构建对象图之后。
我正在使用 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 相关的事情。这意味着您应该不做任何异步的事情根本。
相反,任何缓慢、不可靠或异步的事情都应该推迟到 构建对象图之后。