2016-06-24 6 views
5

私は、Hangfire.CoreとHangfire.SqlServerパッケージがインストールされた簡単な.NET 4.5コンソールアプリケーションを持っています。Hangfireの使用:汎用エンキューメソッドが例外をスローする

私はこのようなバックグラウンドジョブをキュー私のメインの方法では:

BackgroundJob.Enqueue<Test>((t) => Console.WriteLine(t.Sum(3,4))); 

私のテストクラスは、次のようになります。

public class Test 
{ 
    public Test(){ } 

    public int Sum(int a, int b) 
    { 
     return a + b; 
    } 
} 

私は私のプログラムをF5とき、私はとのライン上の例外を取得しますエンキュー:

"未処理のタイプ 'System.InvalidOperationException'の例外がシステムで発生しました( ) .Core.dll追加情報: タイプの変数「T」「HangfireTest.Test」スコープから参照「」が、それは 『新しい「私はコードで私のテストクラスを作成する場合

』定義されて ではありません

BackgroundJob.Enqueue(() => Console.WriteLine(new Test().Sum(3,4))); 

しかし、私はインターフェイスたITestを作成し、このような何かを行うに依存性注入を使用したい原因私は、一般的なものが必要になります:

BackgroundJob.Enqueue<ITest>((t) => Console.WriteLine(t.Sum(3,4))); 
をすべての作品 - と非ジェネリックエンキューメソッドを使用します

ここで私は何を間違えているのですか?

+0

あなたの変数 'T'があるようですインスタンス化されることはありません。 – lokusking

答えて

2

呼び出しメソッドのスコープでバックグラウンドメソッドの戻り値を使用することはできません。この機能は、そのまま使用することはできません。それがあなたの必要条件であれば、非同期操作を検討することができます。 この問題を回避する方法は、hereです。

Hangfireでは、代わりにConsonle.WriteLine部分を別のジョブにラップし、バックグラウンドジョブとしてエンキューします。

だからあなたの改定クラスは、この何かのように見えるかもしれません -

public class Test 
{ 
    public Test() { } 

    public int Sum(int a, int b) 
    { 
     return a + b; 
    } 

    public void SumJob(int a, int b) 
    { 
     var result = Sum(a, b); 
     Console.WriteLine(result); 
    } 
} 

...そしてあなたは今、このようなジョブをキューに入れることができるようになります -

BackgroundJob.Enqueue<Test>(t => t.SumJob(3, 4)); 
関連する問題