zoukankan      html  css  js  c++  java
  • c# aop

    核心代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Remoting.Activation;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    using System.Text;
    
    namespace Da.Extend
    {
      
    using Castle.MicroKernel;
    using Castle.Windsor;
    using Castle.Windsor.Configuration.Interpreters;
    using Castle.Windsor.Installer;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Da.Extend
    {
        public class CastleContainer
        {
            private static readonly object _locker = new object();
            private static CastleContainer _instance;
            private static IKernel _kernel;
    
            private CastleContainer()
            {
                Castle.Core.Resource.ConfigResource source = new Castle.Core.Resource.ConfigResource("castle");
                XmlInterpreter interpreter = new XmlInterpreter(source);
                IWindsorContainer windsor= new WindsorContainer(interpreter);
                _kernel = windsor.Kernel;
            }
    
            public static CastleContainer CreateInstance()
            {
                if (_instance == null)
                {
                    lock (_locker)
                    {
                        if (_instance == null)
                        {
                            _instance = new CastleContainer();
                        }
                    }
                }
                return _instance;
            }
    
            public T Resolve<T>()
            {
                return _kernel.Resolve<T>();
            }
    
    
        }
    }
    
    
    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler,Castle.Windsor"/>
      </configSections>
      <castle>
        <components>
          <component   id="IUserDao"   service="Da.Dao.IUserDao,Da.Dao"   type="Da.Dao.UserDao,Da.Dao" />
        </components>
      </castle>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      </startup>
    </configuration>
    
    
     var userService = new UserService();
     userService.usrDao = CastleContainer.CreateInstance().Resolve<IUserDao>();
     userService.Add(10);
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Remoting.Activation;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    using System.Text;
    
    namespace Da.Extend
    {
    
    
        public class AopProxy : RealProxy
        {
            public AopProxy(Type serverType): base(serverType){}
    
            /// <summary>
            /// 拦截统一方法
            /// </summary>
            /// <param name="msg"></param>
            /// <returns></returns>
            public override IMessage Invoke(IMessage msg)
            {
                IMessage message=null;
                try
                {
                    if (msg is IConstructionCallMessage)
                    {
                        IConstructionCallMessage callMsg = msg as IConstructionCallMessage;
                        object[] args = callMsg.Args;
                        BeforeConstructProceed(ref callMsg);
                        IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg);
                        AfterConstructProceed(ref callMsg);
                        RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue);
                        message = constructionReturnMessage;
                    }
                    else if (msg is IMethodCallMessage)
                    {
                        IMethodCallMessage callMsg = msg as IMethodCallMessage;
                        object[] args = callMsg.Args;
                        object result = null;
                        BeforeMethodProceed(ref callMsg);
                        result = callMsg.MethodBase.Invoke(GetUnwrappedServer(), args);
                        AfterMethodProceed(ref callMsg);
                        message = new ReturnMessage(result, args, args.Length, callMsg.LogicalCallContext, callMsg);
                    }
                }
                catch (Exception ex)
                {
                    message = null;
                    throw ex;
                }
                return message;
            }
    
    
            /// <summary>
            /// 调用构造函数方法前拦截
            /// </summary>
            /// <param name="callMsg"></param>
            public virtual void BeforeConstructProceed(ref IConstructionCallMessage callMsg)
            {
                Console.WriteLine("调用前的拦截器,构造函数参数数量:{0}。", callMsg.Args.Length);
            }
    
             /// <summary>
            /// 调用构造函数方法后拦截
            /// </summary>
            /// <param name="callMsg"></param>
            public virtual void AfterConstructProceed(ref IConstructionCallMessage callMsg)
            {
                Console.WriteLine("调用后的拦截器,构造函数参数数量:{0}。", callMsg.Args.Length);
            }
    
            /// <summary>
            /// 调用普通方法前拦截
            /// </summary>
            /// <param name="callMsg"></param>
            public virtual void BeforeMethodProceed(ref IMethodCallMessage callMsg)
            {
                Console.WriteLine("调用普通方法前的拦截器,方法参数是1:{0}。", callMsg.Args[0]);
            }
    
            /// <summary>
            /// 调用普通方法后拦截
            /// </summary>
            /// <param name="callMsg"></param>
            public virtual void AfterMethodProceed(ref IMethodCallMessage callMsg)
            {
                Console.WriteLine("调用普通方法后的拦截器,方法参数是1:{0}。", callMsg.Args[0]);
            }  
       }
    
        /// <summary>
       /// Aop特性类
       /// </summary>
       public class AopAttribute : ProxyAttribute
       {
           /// <summary>
           /// 创建对象实例
           /// </summary>
           /// <param name="serverType"></param>
           /// <returns></returns>
           public override MarshalByRefObject CreateInstance(Type serverType)
           {
               AopProxy realProxy = new AopProxy(serverType);
               return realProxy.GetTransparentProxy() as MarshalByRefObject;
           }
       }
    
    }

    配置代码:

     [AopAttribute]
        public class UserService:ContextBoundObject
        {
            public IUserDao usrDao { get; set; }
    
            //private IUserDao usrDao = new UserDao();
    
            //private UserDao usrDao = new UserDao();
    
            public UserService()
            {
                Console.WriteLine("这是UserService的构造函数");
            }
    
            public virtual void Add(int userId)
            {
                if (usrDao != null)
                {
                    usrDao.Add(userId);
                }
            }
    
        }

    调用代码:

    var userService = new UserService();
    userService.usrDao = CastleContainer.CreateInstance().Resolve<IUserDao>();
    userService.Add(10);
  • 相关阅读:
    gdb
    wine
    xen
    编程都是人上人,果不其然!2020年度十大高薪岗位,程序员独领风骚!
    【C++学习笔记】深入了解C++ 结构体与共用体,看这篇就够了!
    谁说C语言很简单?这14道C语言谜题,简直难哭了...
    十行代码15个 bug!程序员:不知道有句话当讲不当讲?
    【C++学习笔记】C++ 使用new与delete时,你注意到这3个地方了吗?
    【C++学习笔记】一分钟带你了解C++中new和delete的使用方法!
    惊!黄道十二宫杀手密码,半个世纪未解之谜,竟然被他们破解了...
  • 原文地址:https://www.cnblogs.com/joyet-john/p/7240638.html
Copyright © 2011-2022 走看看