是否有使用面向方面编程注入重复代码的替代方法。 假设我们有一个包含许多属性的类,如果属性更改了它的值,我们想记录它。
class Person
{
public string Name
{
get{return name;}
set
{
name = value;
LogPropertyChanged("Name");
}
}
public int Age
{
get{return age;}
set
{
age = value;
LogPropertyChanged("Age");
}
}
}
如何在不使用面向方面编程的情况下摆脱安全检查,日志记录和其他类似的重复代码。
答案 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。