2015-12-16 9 views
7

下記の静的クラスを参照してください。C#でこの静的クラスをリファクタリングする最良の方法は?

public static class BackgroundTaskExecuter 
{ 
    public static void MethodA() 
    { 
     using (var service = IocManager.Instance.ResolveAsDisposable<IServiceA>()) 
     { 
      service.Object.MethodA(); 
     } 
    } 

    public static void MethodB() 
    { 
     using (var service = IocManager.Instance.ResolveAsDisposable<IServiceB>()) 
     { 
      service.Object.MethodB(); 
     } 
    } 

    public static void MethodC() 
    { 
     using (var service = IocManager.Instance.ResolveAsDisposable<IServiceC>()) 
     { 
      service.Object.MethodC(); 
     } 
    } 
} 

ご覧のとおり、3つの方法があります。 MethodAMethodB、3つの異なるインタフェースIServiceAに対応MethodCIServiceB、と私はaspnetboilerplateフレームワークとし、HangfireにHangfire.ioを使用していますので、私はこれをやっているIServiceC

理由は、バックグラウンドタスクは、のHttpContextを持っていません通常の依存性注入から。私が手動で解決したところで私の呼び出しをラップする静的なクラスを作成することは、これを回避するようです。

使い方は次のようになります。

BackgroundJob.Enqueue(() => BackgroundTaskExecuter.MethodA()); 

今のところ、私は私のウェブアプリで1つのまたは2つの背景のタスクを持っていますが、多分私は将来的にはより多くを有していてもよく、それは今、保守だが、それを私がこのアプローチをとっていれば、最終的に醜いだろう。

これを行うより良い方法はありますか/リファクタリングするのですか?おそらくそのような工場のパターンか何か?

ありがとうございました。

+1

@RuneFS example/hypothetical/MCVEコードは、[codereview.se]でオフトピックです。 [SOユーザーのためのコードレビューガイド](http://meta.codereview.stackexchange.com/questions/5777/a-guide-to-code-review-for-stack-overflow-users)を参照してください。 –

+0

私はこの質問が実際にヘルプセンターで定義された範囲に従っていると主張します。 –

答えて

6

私は静的なラッパーを汎用的かつ単純にします。サービスを解決し、usingステートメントを使用してそれを消費する単一のメソッドを公開し、呼び出し側がAction<T>に渡されたインスタンスを呼び出すことを可能にします。あなたが解決し、消費するサービスの実装を、必要に応じてその機能を呼び出すことができます上記で

ソース

public static class BackgroundTaskExecuter 
{ 
    public static void ResolveAndConsume<T>(Action<T> consumeService) 
    { 
     // Consider applying constraint to the <T> to 
     // match the constraint of ResolveAsDisposable<T> 
     using (var service = IocManager.Instance.ResolveAsDisposable<T>()) 
     { 
      consumeService(service); 
     } 
    } 
} 

使用例

BackgroundJob.Enqueue(() => 
    BackgroundTaskExecuter.ResolveAndConsume<IServiceA>(serviceA => serviceA.MethodA())); 

+1

これらのサービスはすべて共通のインターフェースを持っていると思いますが、そのことの兆候はありません –

+1

'T 'に' IService'という制約があると仮定しましたが、それは必要ではありません。 'ResolveAsDisposable 'メソッドの制約に従うだけです。 –

関連する問題