1、Unity
Unity IOC容器是由微软发布的。它促进了松散耦合应用程序的构建,一个轻量级,可扩展的依赖注入容器,为松散耦合应用程序提供了很好的解决方案,支持构造器注入,属性注入,方法注入。
2、安装引用Unity Interception
1)使用Nuget管理控制台
可以通过打开包管理器控制台(PM)并键入以下语句来安装Unity:
Install-Package Unity Install-Package Unity.Interception
2)使用Nuget图形管理器
使用Nuget的界面的管理器搜索 "Unity" 和"Unity Interception" => 找到分别点击"安装"。
3)使用.NET CLI命令安装
> dotnet add TodoApi.csproj package Unity > dotnet add TodoApi.csproj package Unity.Interception
相关文档:VS(Visual Studio)中Nuget的使用
3、使用静态代理实现AOP
使用面向对象的方式实现AOP,代码如下,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication { //一般每个接口或类都写在单独的.cs文件中 //本示例为了执行查看方便才写在一起 public class User { public string UserName { get; set; } public string PassWord { get; set; } } public interface IUserProcessor { void RegUser(User user); } public class UserProcessor : IUserProcessor { public void RegUser(User user) { Console.WriteLine(" 用户已注册。Name:{0},PassWord:{1} ", user.UserName, user.PassWord); } } //通过定义一个装饰器类实现 public class UserProcessorDecorator : IUserProcessor { public IUserProcessor UserProcessor { get; set; } public UserProcessorDecorator(IUserProcessor userprocessor) { UserProcessor = userprocessor; } public void RegUser(User user) { PreProceed(user); UserProcessor.RegUser(user); PostProceed(user); } public void PreProceed(User user) { Console.WriteLine(" 方法执行前 "); } public void PostProceed(User user) { Console.WriteLine(" 方法执行后 "); } } class Program { static void Main(string[] args) { User user = new User() { UserName = "cjavapy", PassWord = "123456" }; IUserProcessor userprocessor = new UserProcessorDecorator(new UserProcessor()); userprocessor.RegUser(user); Console.ReadKey(); } } }
4、使用Unity实现AOP
使用Unity实现AOP相关示例,代码如下,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Unity; using Unity.Interception; using Unity.Interception.ContainerIntegration; using Unity.Interception.InterceptionBehaviors; using Unity.Interception.Interceptors.InstanceInterceptors.InterfaceInterception; using Unity.Interception.PolicyInjection.Pipeline; namespace ConsoleApplication { //一般每个接口或类都写在单独的.cs文件中 //本示例为了执行查看方便才写在一起 public class User { public string UserName { get; set; } public string PassWord { get; set; } } public interface IUserProcessor { void RegUser(User user); } class ProcessorInterceptionBehavior : IInterceptionBehavior { public bool WillExecute { get { return true; } } public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) { IMethodReturn result = null; try { if (input.Arguments.Count > 0) { PreProceed(input.Arguments[0] as User); } // Invoke the next behavior in the chain. result = getNext()(input, getNext); if (input.Arguments.Count > 0) { PostProceed(input.Arguments[0] as User); } } catch (Exception) { Console.WriteLine("方法出错调用"); throw; } return result; } public void PreProceed(User user) { Console.WriteLine(" 方法执行前:" + user.UserName); } public void PostProceed(User user) { Console.WriteLine(" 方法执行后:" + user.UserName); } public IEnumerable GetRequiredInterfaces() { return new List { typeof(IUserProcessor) }; } } public class UserProcessor : IUserProcessor { public void RegUser(User user) { Console.WriteLine(" 用户已注册。Name:{0},PassWord:{1} ", user.UserName, user.PassWord); } } class Program { static void Main(string[] args) { User user = new User() { UserName = "cjavapy", PassWord = "123456" }; IUnityContainer container = new UnityContainer(); container.AddNewExtension(); // 注册用于拦截的UserProcessor类型 container.RegisterType( new Interceptor(), new InterceptionBehavior()); // 获取一个带有截取管道的代理对象 var p = container.Resolve(); p.RegUser(user); Console.ReadKey(); } } }
输出:
方法执行前:cjavapy
用户已注册。Name:cjavapy,PassWord:123456
方法执行后:cjavapy