我有这都需要在继续用自己的执行之前,执行相同功能的不同个体的方法。 现在,我可以实现在每个方法这些功能,但我不知道是否有一种方法利用attributes
做到这一点? 作为一个非常简单的例子,所有的网络电话要检查网络连接。
public void GetPage(string url)
{
if(IsNetworkConnected())
...
else
...
}
这将工作,但我不得不致电IsNetworkConnected
为使用网络的每个方法的方法和单独处理。 相反,我想这样做
[NetworkCall]
public void GetPage(string url)
{
...
}
如果网络不可用,一个错误就被调用和GetPage
被忽略,否则GetPage
被调用。
这听起来很像看点导向编程,但我不希望实施了几个电话的整个框架。 这更是一个学习锻炼比实现一个的,所以我很好奇,怎么这样的事情会得到更好的实现。
您可以使用PostSharp ,它是.NET面向方面的框架,它似乎很容易使用 :
static void Main(string[] args)
{
Foo();
}
[IgnoreMethod(IsIgnored=true)]
public static void Foo()
{
Console.WriteLine("Executing Foo()...");
}
[Serializable]
public class IgnoreMethodAttribute : PostSharp.Aspects.MethodInterceptionAspect
{
public bool IsIgnored { get; set; }
public override void OnInvoke(PostSharp.Aspects.MethodInterceptionArgs args)
{
if (IsIgnored)
{
return;
}
base.OnInvoke(args);
}
}
方法级别方面功能都可以在免费版: http://www.sharpcrafters.com/purchase/compare
运行时的性能:
由于PostSharp是一个编译器技术,最昂贵的工作在构建时完成,以便应用程序快速启动和快速执行。 当生成代码,PostSharp取假设调用虚拟方法或获取一个静态字段是昂贵的操作。 相反的传闻,PostSharp并不在运行时使用的System.Reflection。 http://www.sharpcrafters.com/postsharp/performance
我不认为你可以做到这一点attributes
而已,因为如果你不积极做好与他们的东西,他们不会被运行时执行。 一个轻量级的方法是Ninject与拦截的扩展 ,它是一个框架,而是一个非常薄的一个,和一个你可能已经无论如何使用DI。
另一种选择,但更复杂一些,可以基于MEF ,然后你可以使用属性和激活过程中与他们在做些什么。
你说得对,这听起来很像AOP。
你喜欢编译时编织的声音之后是什么? 即,属性是由编译器变成额外的代码。
你可以看一下如何实现这个...
通过自定义属性来生成额外的代码
http://www.cs.columbia.edu/~eaddy/wicca/ &
http://www.sharpcrafters.com/aop.net/compiletime-weaving
所有的参考工具和这样的技术。
或者你可以使用一个AOP框架。 恕我直言,你应该看看AOP框架。