我有各种各样的方法,在继续自己的实现之前都需要执行相同的功能。现在我可以在每个方法中实现这些函数,但我想知道是否有办法利用attributes
来执行此操作?作为一个非常简单的示例,所有网络呼叫都必须检查网络连接。
public void GetPage(string url)
{
if(IsNetworkConnected())
...
else
...
}
这可行,但我必须为使用网络的每个方法调用IsNetworkConnected
方法并单独处理它。相反,我想这样做
[NetworkCall]
public void GetPage(string url)
{
...
}
如果网络不可用,则会调用错误方法,忽略GetPage
,否则会调用GetPage
。
这听起来非常像Aspect Orientated Programming,但我不想为几个调用实现整个框架。这是一个学习练习而不是实施练习,所以我很好奇这样的事情是如何最好地实现的。
答案 0 :(得分:3)
您可以使用PostSharp,它是面向方面的.NET框架,似乎是quite easy to use:
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
答案 1 :(得分:1)
我认为你不能仅使用attributes
执行此操作,因为如果您没有主动执行某些操作,它们不会被运行时执行。一个轻量级的方法是Ninject with Interceptions extension,它是一个框架,但是非常薄,而且你可能已经在使用DI了。
另一个选项,但更多涉及,可以基于MEF,然后您可以使用属性并在激活期间执行某些操作。
答案 2 :(得分:1)
你是对的,听起来很像AOP
您所追求的是听起来像编译时编织?即该属性由编译器转换为附加代码
你可以看看如何实现这个...
Generating additional code through a custom attribute
http://www.cs.columbia.edu/~eaddy/wicca/&
http://www.sharpcrafters.com/aop.net/compiletime-weaving
所有这些都涉及这样做的工具和技术。
或者您可以使用AOP框架。恕我直言,你应该看看AOP框架。