4

有没有使用面向方面编程注入重复代码的替代方法。假设我们有一个包含许多属性的类,如果一个属性的值发生了变化,我们希望记录下来。

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

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

如果不使用面向方面的编程,您将如何摆脱重复性代码,如安全检查、日志记录和类似的东西。

4

6 回答 6

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);
    }
}
于 2013-04-20T14:45:53.420 回答
0

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

于 2013-04-20T16:43:18.953 回答
0

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

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

以下这些链接可以帮助您入门。

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 平台的界限,我还没有开始为我的工作实施它。

于 2013-04-19T23:44:09.007 回答
0

我认为如果没有第三方工具(对于一般的 AOP),你能做的最好的事情就是装饰器模式,但我不确定这是否会对INotifyPropertyChanged模式有很大帮助。Filip 的答案(或类似的答案)可能是您现在在 C# 中可以做的最好的。

据我所知,您的团队政策似乎非常严格和严厉,但从另一个角度来考虑您的团队政策中可能存在的“漏洞”:有一个称为 Fody 的 IL 操作框架,它有许多插件(其中一个其中处理INotifyPropertyChanged,称为PropertyChanged.Fody)。在构建过程中,Fody 会修改您编译的程序集,但生成的程序集(即您发布的代码)不依赖于 Fody 或插件(与您必须发布 PostSharp 的 PostSharp 或 Castle DynamicProxy 不同)。 dll 或 Castle.Core.dll 与您的项目)。

于 2013-04-22T01:30:59.247 回答
0

如果您不想使用外部运行时框架,您可以使用模型驱动方法- 您有一个计算机可读格式的业务模型(即 xml oder 使用数据库定义)并有一些代码生成器来生成所需的源代码使用代码模板的模型。

dotnet-typed-datasets 是基于模型的编程的一个示例。c# dataset-sourcecode 是从 xsd-dataset-model 生成的。

mygeneration是一个可以使用模板从数据库模型中生成源代码的软件。

于 2013-04-20T16:53:07.043 回答
0

好吧,您当然可以自己实现所有这些,但话又说回来,为什么要重新发明轮子?除了编译时的注入代码之外,您实际上无能为力。

于 2013-04-19T21:57:23.667 回答