脚本宝典收集整理的这篇文章主要介绍了Unity.Interception(AOP),脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
2.业务实现
public class PeopleTalk : ITalk { PRivate string username; private int age; public string UserName { get { return username; } } public int Age { get { return age; } } public PeopleTalk(string userName, int age) { this.username = userName; this.age = age; } public virtual void talk(string msg) { Console.WriteLine(msg + "!你好,我是" + username + ",我的年龄" + age); } }
3.代理对象
public class TalkProxy : ITalk { private ITalk talker; public TalkProxy(ITalk talker) { this.talker = talker; } public void talk(string msg) { talker.talk(msg); } public void talk(string msg, string singName) { talker.talk(msg); sing(singName); } public void sing(string singName) { Console.WriteLine("唱歌:" + singName); } }
4.调用
class Program { static void Main(string[] args) { #region 静态代理 ITalk people = new PeopleTalk("AOP", 18); people.talk("No ProXY test!"); Console.WriteLine("---------------------------------"); TalkProxy talker = new TalkProxy(people); talker.talk("ProXY Test", "代理"); #endregion } }
代理模式是一种简单的AOP,talk是一个切面,我们可以在代理类中添加日志、校验、异常处理等等。这样我们就实现了,核心关注点与横切关注点的分离。正如Avanade公司的高级方案架构师Adam Magee所说,AOP的核心思想就是”将应用程序中的商业逻辑同对其提供支持的通用服务进行分离“。
/// <summary> /// Unity为我们提供了一个IInterceptionBehavior接口需要实现这个接口 /// 接口为我们提供了三个方式(GetRequiredInterfaces、Invoke、WillExecute)实现 /// WillExecute表示是否执行该行为,如果是false这个方法被调用时,不会被捕捉。因为我们总是要执行的,所以为true /// GetRequiredInterfaces将你想要的接口类型和行为联系起来,我们暂时不需要,所以返回Type.EmptyTypes /// Invoke执行方式接口 /// </summary> public class LoggingInterceptionBehavior : IInterceptionBehavior { public bool WillExecute { get { return true; } } public IEnumerable<Type> GetRequiredInterfaces() { return Type.EmptyTypes; } public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) { Console.WriteLine("Method: {0}", input.MethodBase.Name); Console.WriteLine("参数:"); for (VAR i = 0; i < input.arguments.Count; i++) { Console.WriteLine("{0}: {1}", input.Arguments.ParameterName(i), input.Arguments[i]); } Console.WriteLine("执行前"); var result = getNext()(input, getNext);//在这里执行方法 if (result.Exception != null) { //发生错误记录日志 Console.WriteLine(String.Format("Method {0} threw exception {1} at {2}", input.MethodBase, result.Exception.Message, DateTime.Now.ToLongTimeString())); } Console.WriteLine("执行后"); return result; } }
2.调用
class Program { static void Main(string[] args) { UnityContainer container = new UnityContainer(); container.AddNewExtension<Interception>(); container.RegisterType<ITalk, PeopleTalk>( new InjectionConstructor("AOP", 18), new Interceptor<Interfaceinterceptor>(), new InterceptionBehavior<LoggingInterceptionBehavior>()); ITalk talker = container.Resolve<ITalk>(); talker.talk("ProXY Test!"); } }
以上基本完成了简单的Unity.Interception
当然在Unity中不只有InterfaceInterceptor一种拦截器,它还包含其它两种拦截器:TransparentProxyInterceptor 与 VirtualMethodInterceptor
这里就不详细介绍就提一下这三种:
如果有不懂的可以先查看
Unity 依赖注入之一
Unity 依赖注入之二
出处:https://www.cnblogs.COM/chengxuzhimei/p/5198381.htML
/// <summary> /// 接口 /// </summary> public interface ITalk { void talk(string msg); }
2.业务实现
public class PeopleTalk : ITalk { private string username; private int age; public string UserName { get { return username; } } public int Age { get { return age; } } public PeopleTalk(string userName, int age) { this.username = userName; this.age = age; } public virtual void talk(string msg) { Console.WriteLine(msg + "!你好,我是" + username + ",我的年龄" + age); } }
3.代理对象
public class TalkProxy : ITalk { private ITalk talker; public TalkProxy(ITalk talker) { this.talker = talker; } public void talk(string msg) { talker.talk(msg); } public void talk(string msg, string singName) { talker.talk(msg); sing(singName); } public void sing(string singName) { Console.WriteLine("唱歌:" + singName); } }
4.调用
class Program { static void Main(string[] args) { #region 静态代理 ITalk people = new PeopleTalk("AOP", 18); people.talk("No ProXY Test!"); Console.WriteLine("---------------------------------"); TalkProxy talker = new TalkProxy(people); talker.talk("ProXY Test", "代理"); #endregion } }
代理模式是一种简单的AOP,talk是一个切面,我们可以在代理类中添加日志、校验、异常处理等等。这样我们就实现了,核心关注点与横切关注点的分离。正如Avanade公司的高级方案架构师Adam Magee所说,AOP的核心思想就是”将应用程序中的商业逻辑同对其提供支持的通用服务进行分离“。
/// <summary> /// Unity为我们提供了一个IInterceptionBehavior接口需要实现这个接口 /// 接口为我们提供了三个方式(GetRequiredInterfaces、Invoke、WillExecute)实现 /// WillExecute表示是否执行该行为,如果是false这个方法被调用时,不会被捕捉。因为我们总是要执行的,所以为true /// GetRequiredInterfaces将你想要的接口类型和行为联系起来,我们暂时不需要,所以返回Type.EmptyTypes /// Invoke执行方式接口 /// </summary> public class LoggingInterceptionBehavior : IInterceptionBehavior { public bool WillExecute { get { return true; } } public IEnumerable<Type> GetRequiredInterfaces() { return Type.EmptyTypes; } public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) { Console.WriteLine("Method: {0}", input.MethodBase.Name); Console.WriteLine("参数:"); for (var i = 0; i < input.Arguments.Count; i++) { Console.WriteLine("{0}: {1}", input.Arguments.ParameterName(i), input.Arguments[i]); } Console.WriteLine("执行前"); var result = getNext()(input, getNext);//在这里执行方法 if (result.Exception != null) { //发生错误记录日志 Console.WriteLine(String.Format("Method {0} threw exception {1} at {2}", input.MethodBase, result.Exception.Message, DateTime.Now.ToLongTimeString())); } Console.WriteLine("执行后"); return result; } }
2.调用
class Program { static void Main(string[] args) { UnityContainer container = new UnityContainer(); container.AddNewExtension<Interception>(); container.RegisterType<ITalk, PeopleTalk>( new InjectionConstructor("AOP", 18), new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<LoggingInterceptionBehavior>()); ITalk talker = container.Resolve<ITalk>(); talker.talk("ProXY Test!"); } }
以上基本完成了简单的Unity.Interception
当然在Unity中不只有InterfaceInterceptor一种拦截器,它还包含其它两种拦截器:TransparentProxyInterceptor 与 VirtualMethodInterceptor
这里就不详细介绍就提一下这三种:
如果有不懂的可以先查看
Unity 依赖注入之一
Unity 依赖注入之二
以上是脚本宝典为你收集整理的Unity.Interception(AOP)全部内容,希望文章能够帮你解决Unity.Interception(AOP)所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。