2017-02-16 27 views
1

Ninject 3.2.2.0を使用していますが、非同期メソッドをバインドしようとしています。C#Ninject:メソッドasyncにバインドする方法

これは私がこれまでに得たものである:

kernel.Bind<Task<MyInterface>>().ToMethod(async ctx => 
{ 
    var someData = await DoSomethingAsync(); 
    return new SomethingElse(someData); 
}).InRequestScope(); 

と呼ばれることは決してありませんDoSomethingAsync私の方法。私はMyInterfaceが要求されているので、それが呼び出されていないと信じています。Task<MyInterface>ではありません。

アイデア?

答えて

3

オブジェクトグラフの構成は、reliable and fastである必要があります。これはI/Oに関連するものを除外します。つまり、ではなく、は、非同期のものを実行する必要があります。です。

代わりにのオブジェクトグラフが構築された後、遅い、信頼できない、または非同期のものは、まで延期する必要があります。

+0

サービスまたはデータベースまたはその両方から要求される必要があるCurrentUserオブジェクトにメタデータがあるとします。また、CurrentUserに依存する5つのドメインオブジェクトを構築するとします。 1回のリクエストにつき5回データをリクエストしますか?なぜ、タスクを返すことができるメソッドにバインドしないのですか?タスクが返されたからといって、IOCが待つ必要があるわけではありません。タスクが必要なドメインオブジェクトを待つことができます。違いは、データは一度だけ要求されることです。依存関係はすべて同じタスクを待っています。 –

+0

@StewartAnderson:ここで新しい質問をしている気がします。あなたがここにそのように掲示し、適切な詳細を提供して(いくつかのサンプルコードが役立つでしょう)、その質問へのリンクをコメントに載せれば、私はその質問に答えるために最善を尽くします。 – Steven

+0

あなたのIOCにasnycがないと言うと、私の解決策が問題になることはありませんでした。 私のソリューションをIOCバインディングコードの1行に一般化するには、 kernel.Bind >()。ToMethod(c => UserProvider.Get())。InRequestScope(); 現在のユーザーが必要なものは、IOCを介して非同期に受信します。タスクを必要とするIOCによって構築されたオブジェクトは、タスクを待機しますが、これらのオブジェクトはすべて.InRequestScope()のために同じタスクを待機します。 –

0

私はここに私のバインディング同期

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

を作ることになったが '魔法' です。私は性能があるため、コンテキストスイッチの影響を受けたが、予想通り、少なくともそれが動作し、あなたはそれがデッドロックではないことを確認することができますされて知っている

private string DoSomethingSync() { 
    string result = null; 

    var runSync = Task.Factory.StartNew(async() => { 
     result = await DoSomethingElseAsync(); 
    }).Unwrap(); 
    runSync.Wait(); 

    return result; 
} 

private async Task<string> DoSomethingAsync() { 
    var result = await DoSomethingElseAsync(); 
    return result; 
} 

:私はから私の方法を変更しました。

関連する問題