博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity 3(二):Unity在AOP方面的应用
阅读量:5306 次
发布时间:2019-06-14

本文共 6232 字,大约阅读时间需要 20 分钟。

  本文关注以下方面(环境为VS2012、.Net Framework 4.5以及Unity 3):

  • AOP简介;
  • Interception using Unity示例
  • 配置文件示例

一、AOP简介

  AOP为Aspect-Oriented Programming的缩写,意为"面向切面(方面)编程",按维基百科的解释是"AOP is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns" ()。

  通俗的理解就是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,我们可以理解为在一个服务的流程中,插入与该服务的业务逻辑无关的系统服务逻辑(操作前或操作后),如日志记录、安全认证、性能检测等等。

 

二、Interception using Unity示例

  本示例中主要用于展示如何应用Unity实现编程的Interception,更多内容请阅读

  还是以一个简单的日志记录程序为例

  Console程序如下(以Log为例)

interface ILog    {        void Log(string message);    }
class ConsoleLog : ILog    {        public void Log(string message)        {            Console.WriteLine(message);        }    }

  下面我们编写一个切入的用于记录日志的类,当然首先要引入相应的命名空间,Unity Interception Extension可以通过NuGet获取

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Microsoft.Practices.Unity.InterceptionExtension;namespace Demo{    class LoggingInterceptionBehavior : IInterceptionBehavior    {        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)        {            // Before invoking the method on the original target.            WriteLog(String.Format("Invoking method {0} at {1}",                input.MethodBase,                DateTime.Now.ToLongTimeString()));            // Invoke the next behavior in the chain.            var result = getNext()(input, getNext);            // After invoking the method on the original target.            if (result.Exception != null)            {                WriteLog(String.Format("Method {0} threw exception {1} at {2}",                    input.MethodBase,                    result.Exception.Message,                    DateTime.Now.ToLongTimeString()));            }            else            {                WriteLog(String.Format("Method {0} returned {1} at {2}",                    input.MethodBase,                    result.ReturnValue,                    DateTime.Now.ToLongTimeString()));            }            return result;        }        public IEnumerable
GetRequiredInterfaces() { return Type.EmptyTypes; } public bool WillExecute { get { return true; } } private void WriteLog(string message) { Console.WriteLine(message); } }}

  为了方便观察多个切入,我们在定义一个PerformanceInterceptionBehavior

using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading.Tasks;using Microsoft.Practices.Unity.InterceptionExtension;namespace PCT.Unity.DIWithUntiy{    class PerformanceInterceptionBehavior : IInterceptionBehavior    {        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)        {            Stopwatch stopwatch = new Stopwatch();            stopwatch.Reset();            stopwatch.Start();            // Invoke the next behavior in the chain.            var result = getNext()(input, getNext);            // After invoking the method on the original target.            if (result.Exception != null)            {                WriteLog(String.Format("Method {0} threw exception {1} at {2}",                    input.MethodBase,                    result.Exception.Message,                    DateTime.Now.ToLongTimeString()));            }            else            {                stopwatch.Stop();                WriteLog(String.Format("Method {0} executed {1}", input.MethodBase, stopwatch.Elapsed));            }            return result;        }        public IEnumerable
GetRequiredInterfaces() { return Type.EmptyTypes; } public bool WillExecute { get { return true; } } private void WriteLog(string message) { Console.WriteLine(message); } }}

  最终控制台的代码如下

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.InterceptionExtension;namespace PCT.Unity.DIWithUntiy{    class Program    {        static void Main(string[] args)        {            var container = new UnityContainer();            container.AddNewExtension
(); container.RegisterType
( new Interceptor
(), new InterceptionBehavior
(), new InterceptionBehavior
()); var logger = container.Resolve
(); logger.Log("Hello, Unity Framework!"); Console.ReadKey(); } }}

  运行结果如下

  如果我们把代码改成如下

container.RegisterType
( new Interceptor
(), new InterceptionBehavior
(), new InterceptionBehavior
());

  再次运行

  是不是发现了什么,对,切入的顺序不同,最终执行的顺序也不同。

 

三、配置文件示例

  控制台代码

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.Configuration;using Microsoft.Practices.Unity.InterceptionExtension;namespace PCT.Unity.DIWithUntiy{    class Program    {        static void Main(string[] args)        {            var container = new UnityContainer();            //container.AddNewExtension
(); //container.RegisterType
( // new Interceptor
(), // new InterceptionBehavior
(), // new InterceptionBehavior
()); container.LoadConfiguration(); var logger = container.Resolve
(); logger.Log("Hello, Unity Framework!"); Console.ReadKey(); } }}

  配置文件

 

转载于:https://www.cnblogs.com/panchunting/p/Unity_DIWithUnity.html

你可能感兴趣的文章
Competing Consumers Pattern (竞争消费者模式)
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
ubuntu 安装后的配置
查看>>
web前端之路,js的一些好书(摘自聂微东 )
查看>>
【模板】对拍程序
查看>>
【转】redo与undo
查看>>
解决升级系统导致的 curl: (48) An unknown option was passed in to libcurl
查看>>
Java Session 介绍;
查看>>
spoj TBATTLE 质因数分解+二分
查看>>
Django 模型层
查看>>
dedecms讲解-arc.listview.class.php分析,列表页展示
查看>>
Extjs6 经典版 combo下拉框数据的使用及动态传参
查看>>
【NodeJS】http-server.cmd
查看>>
研磨JavaScript系列(五):奇妙的对象
查看>>
面试题2
查看>>
selenium+java iframe定位
查看>>
P2P综述
查看>>
第五章 如何使用Burp Target
查看>>
Sprint阶段测试评分总结
查看>>