C#(.Net)面向方面编程(AOP)解决方案及其特性
我想在此询问3个信息:C#(.Net)面向方面编程(AOP)解决方案及其特性,c#,.net,aop,C#,.net,Aop,我想在此询问3个信息: Microsoft的C#(.Net)中没有面向方面编程(AOP)的集成解决方案,对吗?是否有任何此类解决方案正在开发或计划中 有哪些解决方案允许面向方面编程(AOP)在C#(.Net)中使用?它们的优点/缺点是什么?我还没有找到任何包含所有可化身选项和一些信息的综合列表,供我决定使用哪一个。最近的是 考虑到以下标准,C#(.Net)的最佳AOP解决方案是什么 它的工作原理与AspectJ类似,语法也类似 使用简单:不需要XML配置——只需编写一些常规类、一些方面类并编
[Serializable]
public class ErrorAspectAttribute : OnMethodBoundaryAspect {
private bool Notify;
public ErrorAspectAttribute(bool notifyUser = true) {
this.Notify = notifyUser;
}
public override void OnException(MethodExecutionEventArgs args) {
ErrorLoggerUtil.LogException(args.Exception);
if (Notify)
MessageBox.Show("An error has occurred. Please save blah blah blah", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
args.FlowBehavior = FlowBehavior.Return;
}
}
所以一点一点地
我不知道
2-检查
我不知道
4-检查
5-检查(非常确定)
6-否-不确定如何使用GUI来可视化这样的方面问题在于,您正在比较不同的语言,并试图将方形的钉子塞进圆形的孔中 对于Java,AspectJ满足了由于语言限制而产生的需求,但是.NET不一定有这些限制,因为JVM没有,但是Java有 例如,您可以使用IronPython或IronRuby(除其他外)编写非常动态的程序集,因此您可以编写DSL(特定于域的语言),使用户可以添加非XML的代码,但会改变程序的操作方式 您可以使用C#中的扩展方法通过交换程序集来更改行为,这样您就有了一个具有日志文件扩展名的程序集,然后您可以将该程序集交换为另一个具有相同命名空间的程序集,该程序集将数据发送到webservice,或者执行noop 但是,这可能有一些难以克服的限制,比如能够在每个调用的函数中使用一个方面来做一些事情,比如使用cflow(),但这可能是因为我没有充分考虑如何做 我的观点不是要完整解释.NET如何不需要AspectJ,而是要说明有一些方法可以在不使用AOP的情况下获得您所期望的行为 例如,对于在JVM上运行的应用程序,您可以使用Groovy、Clojure、JRuby和Scala来克服Java的限制 更新: 我希望我的答案简短一些,但对AOP的一些理解可能有助于为我的答案添加上下文 面向方面编程(AOP)是一种不同的编程范式,用于跨类的功能,如日志记录。日志记录是一种常见情况,在这种情况下,您可能希望记录所有正在使用的SQL查询,因此,您不需要将代码从一个地方复制到另一个地方,而是将其放在一个地方,然后将其放在您指定的任何地方,因此,如果您以后决定更改日志记录的位置,您可以将其放在一个地方 但是AspectJ有更多的选择。例如,您销售一个存储密码的程序。A公司使用IDEA,B公司使用AES。为了适应这种情况,您需要更改运行时使用的代码,这样您就不必冒重新编译代码和引入新错误的风险,而且代码也会更改,这样每当有人调用
getPassword()
时,都会使用新代码对其进行解密
您还可以向现有类添加功能,因此我会将方法放入接口中,以便使用该接口的所有对象现在都可以访问这些函数,因此这些方法现在在接口中是具体的
但是,通过使用.NET和JVM上的其他语言,您可以使用相同的模块性,通过仔细选择要使用的语言来完成所有这些。例如,在Java中,您可以访问用Groovy或Scala编写的类,因此您可以使用这些语言获得更大的灵活性,并且仍然拥有Java中的主应用程序
例如,在C中,您可以使用F、IronPython或IronRuby来获得此功能,或者在某些情况下,您可以使用C
因此,由于这些虚拟机上提供了这些动态的或强类型的函数式语言,因此对面向方面编程的需求减少了,但是,您可以用多语言解决方案来交换使用方面的复杂性
关于AOP的更多信息,IBM有一些关于使用AOP的令人难以置信的文章AOP@Work系列:
有关.NET上AOP的一些想法,您可以阅读代码混乱的AOP和运行时代理AOP
,正如Adam Rackis所指出的,Post是一条路要走,它离.NET平台上的AspectJ非常近 主要区别显然是AspecJ对方面有语言支持,而Post#是用于.NET程序集的编译后编织器。 (因此没有语言整合) 但是,Post可以使用连接点,如字段访问,请尝试ca