2010-12-08 96 views
6

我有一些接口Decorator模式,而一個類實現了這個接口,說:如何自動生成C#

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設置。

它可能是這個樣子:

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); 

     } 

    } 
} 
2

你試過PostSharp?它可以幫助你自動「儀器」類,並實現你的日誌場景,而不需要真正創建裝飾器。

+0

要小心任何AOP工具 - 如果你的公司需要SOX兼容,那麼它可能不是你的選擇 – stack72 2010-12-08 09:01:52

+0

謝謝,但我想要的東西免費...什麼是SOX? – 2010-12-08 10:06:53

+0

PostSharp有一個免費的社區版。你不必購買它!只需轉到下載頁面。 – Alex 2010-12-08 12:39:06

2

我已經寫了能夠基於一些簡單的約定相當複雜的類生成裝飾的T4模板。該項目可在GitHub - T4Decorators上找到。與T4MVC類似,這是我的想法。

1

我們有同樣的要求,並寫了一個Roslyn發電機來做到這一點,看看這裏:https://github.com/proactima/ProxyGen 您需要稍微修改代碼以適應您的需求。基本上我們將一個接口的方法(全部來自某個命名空間)包裝在一個'ReliableServiceCall'方法中。修改它以做其他事情是微不足道的。