2010-12-08 14 views
6

は、私はいくつかのインタフェースを持っているC#でDecoratorパターンを生成し、クラスがこのインタフェースを実装する方法、言う:は自動

interface IMyInterface 
{ 
    void Func1(); 
    void Func2(); 
} 

class Concrete : IMyInterface 
{ 
    public virtual void Func1() { //do something } 
    public virtual void Func2() { //do something } 
} 

は今、私はいくつかのコンクリートクラスメソッドのそれぞれを飾るクラスを作成したいです呼び出しの前後に、非本番環境で実行される特定のロジックに依存します。

class Decorator : Concrete 
{ 
    public override void Func1() { Pre(); base.Func1; Post(); } 
    public virtual void Func2() { Pre(); base.Func2; Post(); } 
} 

私の質問は、インターフェイス上で反射を使用し、cs拡張子を持つテキストファイルを作成する以外のクラスを自動生成する簡単な方法ですか?

答えて

8

個人的に必要な場合、私はちょうど明示的にログインしますが、あなたはこれを行うにはデコレータを使用して設定されている場合は、RealProxy classを使用することができます。

それは次のようなものになります:私はいくつかの単純な規則に基づいて、かなり複雑なクラスのためにデコレータを生成することが可能なT4テンプレートを書かれている

public class DecoratorProxy<T> : RealProxy 
{ 
    private T m_instance; 

    public static T CreateDecorator<T>(T instance) 
    { 
     var proxy = new DecoratorProxy<T>(instance); 
     (T)proxy.GetTransparentProxy(); 
    } 

    private DecoratorProxy(T instance) : base(typeof(T)) 
    { 
     m_instance = instance; 

    } 
    public override IMessage Invoke(IMessage msg) 
    { 
     IMethodCallMessage methodMessage = msg as IMethodCallMessage; 
     if (methodMessage != null) 
     { 
      // log method information 

      //call method 
      methodMessage.MethodBase.Invoke(m_instance, methodMessage.Args); 
      return new ReturnMessage(retval, etc,etc); 

     } 

    } 
} 
+0

Invokeメッセージは何かを返さなければならないので、私は元のメッセージを返しました。元のメソッドが呼び出されたよりも、次の例外があります。 System.Runtime.Remoting.RemotingException:予期しない型のメッセージでメソッドが呼び出されました。何かご意見は? –

+0

MSDN(http://msdn.microsoft.com/en-us/library/system.runtime.remoting.proxies.realproxy.aspx)を参照すると、IMethodReturnMessageの型が返されます。どうすれば簡単に作成できますか? –

+1

新しいReturnMessage(retval) - http://msdn.microsoft.com/en-us/library/systemを参照してください。runtime.remoting.messaging.returnmessage.aspx – SpeksETC

2

あなたはPostSharpを試みたことがありますか?デコレータを実際に作成することなく、クラスを自動的に「計測」し、ロギングシナリオを達成するのに役立ちます。

+0

どのAOPツールにも注意してください - 会社がSOXに準拠する必要がある場合、それはあなたのためのオプションではないかもしれません – stack72

+0

ありがとうございます。 –

+0

PostSharpには無料のコミュニティ版があります。あなたはそれを購入する必要はありません!ダウンロードページに移動してください。 – Alex

2

ログアプリケーションブロックはどうですか?

http://msdn.microsoft.com/en-us/library/ff647183.aspx

+0

申し訳ありませんが、私の元の質問は正確ではありませんでした - 私は最も単純な意味でログをとっていません。私はいくつかの前後の論理を行います...この図書館のために1つの図書館 –

+0

新しい経験を考えると、私はここに上陸した人々が政策の傍受を見なければならないことを示唆しています。 – brumScouse

2

を。このプロジェクトはGitHub-T4Decoratorsにあります。 T4MVCに似ています。それが私の考えです。

1

私たちはこれを行うためにRoslynジェネレータを書いています:https://github.com/proactima/ProxyGen 必要に応じてコードを少し修正する必要があります。基本的には、「ReliableServiceCall」メソッドでインターフェイスのメソッド(特定の名前空間のすべて)をラップします。これを変更して別のことをするのは簡単です。