通过Unity实现 AOP

需要添加引用

通过Unity实现 AOP_第1张图片


添加命名空间

using Microsoft.Practices.Unity.InterceptionExtension;
using Microsoft.Practices.Unity;


下面方法

public class UnityDemo
    {

        public static void Show()
        {
            Users user = new Users()
            {
                Name = "Eleven",
                Password = "123123123123"
            };

            //IUnityContainer  是接口类型
            IUnityContainer container = new UnityContainer();//声明一个容器
            //IUnityContainer  是接口类型 UserProcessor是继承该接口的类
            container.RegisterType();//声明UnityContainer并注册IUserProcessor
            //IUnityContainer  是接口类型  其余不需要修改
            container.AddNewExtension().Configure()
                .SetInterceptorFor(new InterfaceInterceptor());
            //IUnityContainer  是接口类型
            IUserProcessor userprocessor = container.Resolve();
           
            Console.WriteLine("********************");
            userprocessor.RegUser(user);//调用

        }
    }



    public class UserHandler : ICallHandler
    {
        public int Order { get; set; }
        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
            /////自定义代码部分 开始  这部分的代码 会在方法UserProcessor.RegUser 执行前执行
            Users user = input.Inputs[0] as Users;
            if (user.Password.Length < 10)
            {
                return input.CreateExceptionMethodReturn(new Exception("密码长度不能小于10位"));
            }
            Console.WriteLine("参数检测无误");

            /////自定义代码部分 结束
            IMethodReturn methodReturn = getNext.Invoke().Invoke(input, getNext);
            /////自定义代码部分 开始  这部分的代码 会在方法UserProcessor.RegUser 执行后执行
            /////这里可以写方法
            /////自定义代码部分 结束

            return methodReturn;
        }
    }

    public class UserHandlerAttribute : HandlerAttribute
    {
        public override ICallHandler CreateHandler(IUnityContainer container)
        {
            ICallHandler handler = new UserHandler() { Order = this.Order };
            return handler;

            //也可以直接下面这种写法
            //return new UserHandler() { Order = this.Order };
        }
    }

    public class Users
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Password { get; set; }
    }

    /// 
    /// Order 是执行顺序 排序用的
    /// 
    [UserHandlerAttribute(Order = 1)]
    public interface IUserProcessor
    {
        void RegUser(Users user);      
    }

    public class UserProcessor : IUserProcessor//MarshalByRefObject,
    {
        public void RegUser(Users user)
        {
            Console.WriteLine("用户已注册。");           
        }
    }

调用

UnityDemo.Show();


结果

通过Unity实现 AOP_第2张图片

你可能感兴趣的:(C#,反射)