使用 windsor 实现IOC 和 AOP

 代码很简单,不多说。

对于拦截,windsor 使用动态代理的方式,即生成继承类的方式来实现的,因此无法拦截private 方法,因为无法在继承类中看见private方法。

 

using System;

using System.Reflection;

using Castle.Core;

using Castle.DynamicProxy;

using Castle.MicroKernel.Registration;

using Castle.Windsor;



namespace WindsorSample

{

    public class ApplicationInterceptor : IInterceptor

    {

        #region IInterceptor Members



        public void Intercept(IInvocation invocation)

        {

            Console.WriteLine("call started " + invocation.Method.Name);

            invocation.Proceed();

            Console.WriteLine("call ended " + (invocation.ReturnValue ?? "NULL"));

        }



        #endregion

    }



    public interface IUserApplication

    {

        void Show();

    }



    public class UserApplication : IUserApplication

    {

        private static IUserResoistory _userResoistory;



        public UserApplication(IUserResoistory userResoistory)

        {

            _userResoistory = userResoistory;

        }

        public void Show()

        {

            Console.WriteLine(_userResoistory.Name);

        }

    }



    public interface IUserResoistory

    {

        string Name { get; }

    }



    public class UserResoistory : IUserResoistory

    {

        public string Name { get; private set; }



        public UserResoistory()

        {

            Name = "UserResoistory";

        }

    }



    class Program

    {

        static void Main(string[] args)

        {

            IWindsorContainer container = new WindsorContainer();

            container.Register(Classes.FromAssembly(Assembly.GetExecutingAssembly()).BasedOn<IUserResoistory>().WithServiceAllInterfaces());

            container.Register(Component.For<IInterceptor>().ImplementedBy<ApplicationInterceptor>().Named("myinterceptor"));

            container.Register(Component.For<IUserApplication>().ImplementedBy<UserApplication>().Interceptors(InterceptorReference.ForKey("myinterceptor")).Anywhere);



            var userApplication = container.Resolve<IUserApplication>();



            userApplication.Show();



            Console.ReadKey();

        }

    }

}

 

你可能感兴趣的:(AOP)