Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#(.Net)面向方面编程(AOP)解决方案及其特性_C#_.net_Aop - Fatal编程技术网

C#(.Net)面向方面编程(AOP)解决方案及其特性

C#(.Net)面向方面编程(AOP)解决方案及其特性,c#,.net,aop,C#,.net,Aop,我想在此询问3个信息: Microsoft的C#(.Net)中没有面向方面编程(AOP)的集成解决方案,对吗?是否有任何此类解决方案正在开发或计划中 有哪些解决方案允许面向方面编程(AOP)在C#(.Net)中使用?它们的优点/缺点是什么?我还没有找到任何包含所有可化身选项和一些信息的综合列表,供我决定使用哪一个。最近的是 考虑到以下标准,C#(.Net)的最佳AOP解决方案是什么 它的工作原理与AspectJ类似,语法也类似 使用简单:不需要XML配置——只需编写一些常规类、一些方面类并编

我想在此询问3个信息:

  • Microsoft的C#(.Net)中没有面向方面编程(AOP)的集成解决方案,对吗?是否有任何此类解决方案正在开发或计划中

  • 有哪些解决方案允许面向方面编程(AOP)在C#(.Net)中使用?它们的优点/缺点是什么?我还没有找到任何包含所有可化身选项和一些信息的综合列表,供我决定使用哪一个。最近的是

  • 考虑到以下标准,C#(.Net)的最佳AOP解决方案是什么

  • 它的工作原理与AspectJ类似,语法也类似
  • 使用简单:不需要XML配置——只需编写一些常规类、一些方面类并编译,将它们编织在一起,然后运行
  • 应包括AspectJ的所有功能。对泛型的支持
  • 溶液应稳定、广泛使用和维护
  • 应该提供二进制文件(因此可以使用)或C源代码的编织
  • 用于可视化的GUI工具(甚至更好——VS插件)是一个优势
  • 我认为如果某件事符合3中的大多数标准。然后,它是一个普遍使用的解决方案的候选者。如果现有的一些解决方案适合我的需要,我在任何地方都找不到。

    1-正确

    2-PostSharp是一个优秀的C语言AOP库#

    3-我不知道AspectJ是如何工作的,但使用PostSharp,您只需将方面定义为属性,然后用所述属性装饰您的方法

    下面是一个方面的示例,它用try-catch包装方法调用,并记录抛出的任何异常:

    [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