unity3D技术之使用Unity进行AOP对象拦截.docxVIP

unity3D技术之使用Unity进行AOP对象拦截.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
unity3D技术之使用Unity进行AOP对象拦截

HYPERLINK / Unity是一款知名的依赖注入容器,其支持通过自定义扩展来扩充功能。在Unity软件包内默认包含了一个对象拦截(Interception)扩展定义。本篇文章将介绍如何使用对象拦截功能来帮助你分离横切关注点(Separation of cross-cutting concerns)。 对象拦截简介 对象拦截是一种 HYPERLINK /wiki/Aspect-oriented_programming AOP(Aspect-oriented programming)编程的实践方法。其可帮助你保持业务类的纯净,而无需考虑诸如日志和缓存等外围关注点。 在.NET中,实现AOP有多种方法。一种方式是采用编译后处理方式,例如 HYPERLINK /customers PostSharp。在编译后,PostSharp通过修改IL代码来诸如横切代码。 相反地,对象拦截是在运行时执行的,同时也意味着会有一些限制。依据不同的拦截器实现,会有如下这些约束: 透明代理拦截器:需要定义接口,或者要求类继承自MarshalByRefObject。 接口拦截器:需要定义接口。 虚方法拦截器:仅需要方法被定义成virtual方法。 对象拦截如何工作 当从Unity容器请求目标对象时,将不会获取到已配置的类的实例。实际上,将得到一个动态生成的代理对象,或者一个衍生类。 如果调用代理对象的一个方法,将可以在被调用方法执行前或执行后执行一些额外行为的代码。那些定义行为的类需要实现ICallHandler接口。通过这些行为定义,我们可以访问方法调用的参数列表 HYPERLINK 【狗刨学习网】,可以吞噬异常,或者可以返回自定义的异常。 附带提一下,在不使用Unity容器的条件下,也是可以使用Unity拦截器的。 示例:将异常和方法调用参数列表记录到日志中 在下面的示例中,我们将创建两个自定义的行为,都实现了ICallHandler接口: LoggerCallHandler:将方法调用参数列表记录到日志中。 ExceptionLoggerCallHandler:将方法调用参数列表和异常信息及调用栈记录到日志中。 ExceptionLoggerCallHandler定义如下: 1 internal class ExceptionLoggerCallHandler : ICallHandler 2 { 3 public IMethodReturn Invoke( 4 IMethodInvocation input, GetNextHandlerDelegate getNext) 5 { 6 IMethodReturn result = getNext()(input, getNext); 7 if (result.Exception != null) 8 { 9 Console.WriteLine(ExceptionLoggerCallHandler:); 10 Console.WriteLine(\tParameters:); 11 for (int i = 0; i input.Arguments.Count; i++) 12 { 13 var parameter = input.Arguments[i]; 14 Console.WriteLine( 15 string.Format(\t\tParam{0} - {1}, i, parameter.ToString())); 16 } 17 Console.WriteLine(); 18 Console.WriteLine(Exception occured: ); 19 Console.WriteLine( 20 string.Format(\tException - {0}, result.Exception.Message)); 21 22 Console.WriteLine(); 23 Console.WriteLine(StackTrace:); 24 Console.WriteLine(Environment.StackTrace); 25 } 26 27 return result; 28 } 29 30 public int Order { get; set; } 31 } 为了

文档评论(0)

kabudou + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档