2011-01-04 23 views
0

私はWCFサービスを使用するプロジェクトを引き継いでいます。コードにはいくつかの「コードの匂い」があり、これらの匂いをリファクタリングする必要があります。コードの複製の匂いをリファクタリングする方法についてのアドバイスが必要です。 WCFサービスによって呼び出されるすべてのメソッドは次のようになります。()try {} catch {}

public Result MyMethod(string aString, string bString) 
{ 
    string methodName = MethodBase.GetCurrentMethod().Name; 
    using (LogService log = LogFactory.Create()) 
    { 
     try 
     { 
      <stmts> 
      log.Info(methodName, "Created entity xyz"); 
      <stmts> 
     } 
     catch (Exception ex) 
     { 
      log.Error(methodName, ex.message); 
     } 

    } 
} 

質問は、私はこのコードをリファクタリングはどうすればよいのですか?すべてのWCF呼び出しでこの「コードテンプレート」が使用されます。

答えて

4

フォロー例えば

private static void ActionWithLog(Action before, Action after) 
    { 
     string methodName = MethodBase.GetCurrentMethod().Name; 
     using (LogService log = LogFactory.Create()) 
     { 
      try 
      { 
       before(); 
       log.Info(methodName, "Created entity xyz"); 
       after(); 
      } 
      catch (Exception ex) 
      { 
       log.Error(methodName, ex.message); 
      } 
     } 
    } 

:あなたはそれを排除するためにAOPを使用することができ など、ロギング、例外処理:

ActionWithLog(() => service.Operation1(),() => service.Operation2()); 
+0

私は思っていた点で何かでした。ありがとう! – Drazar

2

例外についての1つの良い点は、キャッチされていないとバブルアップすることです。だから、上記のレベル(またはいくつかのレベル)を捕らえさせて、大きなキャッチとロギングに役立ててください。 例外の.stacktraceプロパティにはメソッド名が含まれています。その情報を失わないように、単にメッセージとメソッド名ではなくログに記録するほうが便利でしょう。

2

あなたはこのコード方式にし、それを呼び出す、デリゲートまたはアクション/ラムダ式として内部コードを渡すことができます。

public Result MyMethod(string aString, string bString, MyDelegate a, MyDelegate b) 
{ 
    string methodName = MethodBase.GetCurrentMethod().Name; 
    using (LogService log = LogFactory.Create()) 
    { 
     try 
     { 
      a(); 
      log.Info(methodName, "Created entity xyz"); 
      b(); 
     } 
     catch (Exception ex) 
     { 
      log.Error(methodName, ex.message); 
     } 

    } 
} 

その後、同じようにそれを呼び出します。そうしないと

MyMethod("foo", "bar", delegate{/*your code goes here*/}, delegate{/*your code goes here*/}); 

インラインデリゲートのように、次のように別々のメソッドからデリゲートを作成します。

MyMethod("foo", "bar", new MyDelegate(myMethodA), new MyDelegate(myMethodB)); 
0

それは同様の機能を横断的になる前に、アクションの後でlowing。それ以外の場合は、このコードをリファクタリングすることはお勧めしません。 .NET用のAOPフレームワークは以下の通りです:http://www.sharpcrafters.com/しかし、それは無料ではありません:)。無料のものを検索することができます。