2010-12-08 78 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'方法中。修改它以做其他事情是微不足道的。