面向方面编程的替代方案

时间:2013-04-19 21:52:44

标签: c# .net aop

是否有使用面向方面编程注入重复代码的替代方法。 假设我们有一个包含许多属性的类,如果属性更改了它的值,我们想记录它。

class Person 
{
 public string Name
 {
    get{return name;}
    set
    { 
      name = value;
      LogPropertyChanged("Name");
    }
  }

  public int Age
  {
    get{return age;}
    set
    { 
      age = value;
      LogPropertyChanged("Age");
    }
   }      
}

如何在不使用面向方面编程的情况下摆脱安全检查,日志记录和其他类似的重复代码。

6 个答案:

答案 0 :(得分:1)

你可以随时做这样的事情

a)在对象的某个父类上

protected void SetProperty<T>(Expression<Func<T>> exp, T value)
{
    MemberExpression body = (MemberExpression)exp.Body;
    //set the actual value
    (body.Member as FieldInfo).SetValue(this, value);

    //do some logging, locking, etc. with the field name
    string fieldName = body.Member.Name;
}

b)关于你的对象

private int age;
public int Age
{
    get
    { 
        return age; 
    }
    set
    {
        SetProperty(() => age, value);
    }
}

答案 1 :(得分:0)

嗯,你当然可以自己实现所有这些,但话又说回来,为什么重新发明轮子?除了编译时的注入代码,你无法真正做到。

答案 2 :(得分:0)

几个月前我也在寻找一种方法。这是我做过的一些研究。

这个想法是做一个静态初始化程序,它将通过反射引导并注入MSIL代码(例如,在运行时包装函数以进行日志记录)。 postharp中已经提供了类似的概念,但这是一个不适合我的环境的许可软件。

以下链接可帮助您入门。

http://www.codeproject.com/Articles/37549/CLR-Injection-Runtime-Method-Replacer http://msdn.microsoft.com/en-us/library/h0x241a0.aspx

http://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx#vcwlkattributestutorialanchor3

它确实推动了.net平台的界限,我还没有为我的工作实现它。

答案 3 :(得分:0)

您始终可以创建自己的代码段,以简化此类重复代码模式的创建。有不同的免费代码片段编辑器。我正在使用Snippy。在给出关于SO的另一个问题的答案中我解释了这样的代码片段(它为INotifyPropertyChanged接口创建了属性):https://stackoverflow.com/a/8317280/880990

答案 4 :(得分:0)

如果您不想使用外部运行时框架,可以使用 modell driven approach - 您有一个计算机可读格式的business-modell (即xml或者使用数据库定义)并使用一些代码生成器使用代码模板从modell生成所需的源代码。

dotnet类型数据集是基于模型的编程示例。 c#dataset-sourcecode是从xsd-dataset-modell生成的。

mygeneration是一个可以使用模板从databasemodell生成源代码的软件。

答案 5 :(得分:0)

我认为没有第三方工具(一般来说是AOP)你能做的最好的就是装饰模式,但我不确定这会给你带来很多帮助。 INotifyPropertyChanged模式。菲利普的答案(或类似的东西)可能是你现在在C#中可以做的最好的。

你的团队政策似乎相当严格,而且从我对它的了解看起来很严苛,但这是另一个角度来考虑你团队政策中可能存在的“漏洞”:有一个IL manipulation framework known as Fody,它有很多插件(其中一个处理INotifyPropertyChanged,称为PropertyChanged.Fody)。在构建过程中,Fody会修改您编译的程序集,但结果程序集(即您发布的代码)不依赖于Fody或插件(相反,比如PostSharp或Castle DynamicProxy,你必须在你的项目中运送PostSharp.dll或Castle.Core.dll。