gpt4 book ai didi

.net - 有关面向方面编程的帮助和信息

转载 作者:行者123 更新时间:2023-12-03 13:56:56 25 4
gpt4 key购买 nike

我是面向方面编程的新手,但我想探索在项目中使用它进行日志记录,报告等操作的想法。为此,我有一些问题:


我是否应该为这些有限的目的而费心探索AOP的这条道路?
有哪些支持AOP的.NET Framework?
这些框架中的哪个支持流畅的接口(我讨厌XML配置):)

最佳答案

面向方面的编程不仅限于日志记录,报告等等,还可以看看PostSharp的网站。我个人没有做太多的静态IL编织,主要是动态IL生成来创建AOP拦截器,这样做时,我主要是使用它来包装和拦截来自控制容器反转的解析。

AOP可以改善异常处理,改善跟踪,改善事务拦截。

例如,NHibernate具有某种AOP,尽管就简单的事件处理程序而言,它在编译时是静态的。但是对于引擎中的某些事件,您可以附加拦截器(又名方面,这些事件是切入点等)-我使用它来注入IoC业务实体到我的域对象中。

强大的AOP框架可让您一概而论,而更强大的AOP框架则可让您一概概述运行时的开销。原则上,您可以通过几种不同的方式进行操作:

(0)。 (不是真的)C ++,ifdefs等中的“预处理器” AOP aka模板


反射“ AOP”
通过Reflection.Emit在运行时生成IL,需要高度信任。这是Castle项目中DynamicProxy2采取的路径。 DynamicProxy2非常不错,并且已经完成了很多工作!同样,afaik PatternsAndPractices策略框架也使用这种方法,尽管它们有自己的生成器,但使用了很多XML。 NHibernate依赖于DynProx2。
通过使用System.CodeDom.Compiler在运行时进行IL编译+ Assembly.Load(...),然后加载您创建的组件,需要很高的信任度。也可以使用Boo.Compiler之类的任何其他编译器进行编译,因为它会创建“全局函数程序集”,您可以以“脚本”方式进行调用,但是现在我们略微退出了AOP。
Profiler API(不要问我关于它们的信息)
依靠运行时框架:扩展MarshalByRef / ContextBoundObject see link并使用.Net中的远程处理基础结构来进行AOP,这非常复杂,并引入了您可能不需要的依赖项。
编译后的静态IL编织,PostSharp和Mono.Cecil具有等效的Reflection.Emit,但是此对象没有像Reflection.Emit这样的具体子类(如果我没记错的话)中的虚拟方法调用的错误,我们将很乐意进行检查您的代码类似于Assembly.ReflectionOnlyLoad,并且还允许您将IL操作输出到该代码中。如果您正在寻找一种比较低级的方法,那么这是一个很好的选择。不需要那么高的信任度。
通过p / invoke在托管代码中为C / C ++的非托管回调添加扩展点,但这需要一些考虑,因为异常不会愉快地跨越m / um内存边界(相反,它将使您的应用程序混乱),并且除非如果您在Windows中使用带有托管异常框架的VC ++ / C#,可能会造成严重的段错误。您可以将回调传递给C,然后从C#p / invoke调用C,并且只要您在C#中定义委托,就可以将回调从C传递给C#。扩展点可能必须通过静态或动态IL-weaver +切入点来完成。


交易中的用法
请参阅Castle.Facilities.AutomaticTransactionManagement.TransactionFacility,这是使用AOP处理交易的一种好方法以及DynamicProxy2的拦截功能。与System.Transcations和System.EnterpriseServices集成的事务工具是您正在使用分布式事务协调器(COM组件)来管理事务。另外,有多个p / invoke进入内核以处理TxF and TxR components of the Vista-kernel (aka Server 2008)的示例,这些示例使您可以在NTFS和注册表上使用事务,从而确保您执行的CRUD是ACID,并且还可以与System很好地集成。用于创建嵌套事务的事务。

不变验证中的用法
您还可以通过将一些属性附加到参数来按合同将其用于设计。

public void PerformOperation([NotNull, NotEmpty] string value) {
// use string
[NotNull] return new string(' ', 5); // can return with attributes as well
}


目前的问题是附加此元数据并在运行时检查它的开销。但是,您可以指定仅在使用DEBUG进行编译时才应用约束检查方面,然后此元数据不会导致性能大幅下降。

如果您想了解公理证据,请改用Sing#/ Spec#,因为它比较正式,而且工作由编译器完成。

要注意的事情
要注意的最重要一点是,如果某个问题(即,在您的方法之前或之后运行的某些代码更改了控制流,可能返回了意外的类型,则返回得太早或通常不起作用)您调用的方法的意图可能会导致难以调试的错误。

另外,要提防从属性抛出异常,因为您永远不知道反射发生的时间或对象是什么。当您期望时,对属性的思考可能不会发生。当我在属性中附加类型并仔细检查它们时,这发生在我自己身上。

还要注意以下事实:在添加全局“切入点”时,您可能会打开一个攻击载体,如果有人可以访问,可以使用该“切入点”来重定向系统的大部分内容。

其他框架
如果您有兴趣总体上了解有关AOP的更多信息,建议您参考RickardÖberg在 Qi4J上的介绍,它是Java中用于AOP的非常好的框架(尽管Java具有对象继承的语义略有不同,但对于在C#/ F#/ Nermle / Boo中使用。

AOP +插件
将面向方面的编程与运行时生成的程序集(例如dynamicproxy2创建的程序集)一起使用时,另一个有趣的可能性是,您还可以使用它们来包装跨越应用程序边界的对象,从而简化了外接程序的创建。我曾经暗中希望微软在为3.5创建自己的AddIn-framework时会使用它,但是不幸的是,他们选择采用静态代码生成方式,这给开发人员带来了相当大的创建外接程序的开销。问题是除非再次卸载完整的AppDomain,否则无法再次卸载为“不仅仅是反射”而加载到AppDomain中的类型,因此您需要1)在不加载插件的情况下进行反射以查看其功能,除非您允许写入或生成大量手动元数据(并相信这一点),并且2)某个对象将对象的句柄保存在其中,以便它不会被GC化,并且您也不知道类型(因此,IContract程序集和AddInHandle-class)-使用动态代理/ AOP可以很好地完成。

在公共语言基础结构上的linux / windows上运行的分布式系统中,使用AOP进行全局垃圾回收。该文件有点难以下载,所以 I uploaded it to my server所以我知道它在哪里。

圣经后
(如果您在CLR上使用非标准语言,而不是DLR IL编织可能会创建非标准兼容代码。我认为,这对于F#尤其有趣,因为使用大量非标准代码可带来很多好处语言(元组说)-如果要获取编译时警告,则可以用[assembly:CLSCompliant]标记程序集。)

关于.net - 有关面向方面编程的帮助和信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/559656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com