经过动态代理模式Interceptor实如今RegUser()方法自己业务先后加上一些本身的功能,如:PreProceed和PostProceed,即不修改UserProcessor类又能增长新功能spa
public interface IUserProcessor { void RegUser(User user); }
public class UserProcessor : IUserProcessor { /// <summary> /// 必须带上virtual 不然无效 /// </summary> /// <param name="user"></param> public virtual void RegUser(User user) { Console.WriteLine($"用户已注册。Name:{user.Name},PassWord:{user.Password}"); } }
public class MyInterceptor : IInterceptor { public void Intercept(IInvocation invocation) { PreProceed(invocation); invocation.Proceed();//就是调用原始业务方法 PostProceed(invocation); } public void PreProceed(IInvocation invocation) { Console.WriteLine("方法执行前"); } public void PostProceed(IInvocation invocation) { Console.WriteLine("方法执行后"); } }
调用代理
/// <summary> /// 使用Castle\DynamicProxy 实现动态代理 /// 方法必须是虚方法 /// </summary> public class CastleProxyAOP { public static void Show() { User user = new User() { Name = "Eleven", Password = "123456" }; ProxyGenerator generator = new ProxyGenerator(); MyInterceptor interceptor = new MyInterceptor(); UserProcessor userprocessor = generator.CreateClassProxy<UserProcessor>(interceptor); userprocessor.RegUser(user); } }