2011-02-05 8 views
12

インテグレーション経験がある人は誰でもautofacQuartz.Net?もしそうなら、生涯管理を制御するのにIJobFactory、IJobのExecute内、またはイベントリスナをどこで管理するのが最適でしょうか?オートファックとQuartz.Netインテグレーション


、私はIJobインスタンスを作成するためのカスタムautofac IJobFactoryを使用していますが、私は注射される高価なリソースを確保するためにIJobFactoryでILifetimeScopeにプラグインするための簡単な方法を持っていませんIJobの掃除が済む。ジョブファクトリは、ジョブのインスタンスを作成して返します。ここでは、ほとんどのAutoFacの統合が何らかの形で彼らが作成した作業単位の周りにILifetimeScopeを包むように見えます私の現在の考え(うまくいけば、より良いものがあります...)

  • です。明白なブルートフォースの方法は、IJobILifetimeScopeを渡し、という子を作成してそこに依存関係をインスタンス化することです。これはサービスロケータパターンにはあまりにも近すぎるように思えますが、それはオートファックの精神に反しているようですが、スコープの適切な処理を保証する最も明白な方法かもしれません。

  • 私は、ジョブ実行スタックのさまざまなフェーズを処理し、そこでライフタイム管理を処理するためにQuartzイベントの一部にプラグインすることができました。それはおそらくもっと多くの仕事になるでしょうが、懸念がより明確に分かれば価値があるかもしれません。

  • IJobはIServiceComponent型の単純なラッパーで、すべての作業を行い、Owned<T>またはFunc<Owned<T>>と要求してください。私はこれがautofacでよりいっそう明るくなるように思っていますが、私はIJobのすべての実装者にとって厳しく強制できないのが好きです。

答えて

12

Quartz.NetとIJobについてあまり知らないうちに、私はまだ示唆を残しています。

public class JobWrapper<T>: IJob where T:IJob 
{ 
    private Func<Owned<T>> _jobFactory; 

    public JobWrapper(Func<Owned<T>> jobFactory) 
    { 
     _jobFactory = jobFactory; 
    } 


    void IJob.Execute() 
    { 
     using (var ownedJob = _jobFactory()) 
     { 
      var theJob = ownedJob.Value; 
      theJob.Execute(); 
     } 
    } 
} 

次の登録を考える:

var job = _container.Resolve<JobWrapper<SomeJob>>(); 

注:ジョブ工場は現在、このラッパーを解決することができ

builder.RegisterGeneric(typeof(JobWrapper<>)); 
builder.RegisterType<SomeJob>(); 

は、次のジョブのラッパーを考えてみましょう lifetime scopeはクリエイティブになります ownedJobインスタンス(この場合は Owned<SomeJob>)の一部としてatedされます。 SomeJobが必要とする依存関係が InstancePerLifetimeScopeまたは InstancePerDependencyの場合、 Ownedインスタンスとともに作成され、破棄されます。

+0

おかげでそれを知っています。私は元の質問の第3のブレーンストームのより明示的なバージョンであるという点でアイデアが気に入っています。私にはまだ生き残ることができないということがあります。基本的には、各IJobをWCFサービスコールと同等の「LifetimeScope」で実行したいと考えています。残念なことに、Quartz 'IJobFactory'はかなり難しかったし、私が教えてくれたことを忘れてしまったので、明示的なスコープ境界が必要な場合は、Quartzリスナーシステムを掘り下げなければならないかもしれません。 –

+0

@dfaivre - 私のコードでバグを修正しました。私は 'ownedJob.Value'部分を忘れました。おそらく、私の意図は今より明確です。 –

+3

私は、Ownedがスコープを作成したことを知らなかった。非常に便利。私はこれがおそらく最も単純なアプローチだと思っています。ジョブが 'JobWrapper <>'のタイプでない場合、私はおそらく私の 'IJobFactory'を追加するでしょう。素晴らしい洞察力をもう一度ありがとう。 –

関連する問題