Windsor 依赖注入

Windsor 学习

1.安装nuget   Install-Package Castle.Windsor

 安装后会多这两个引用 

 

 2.hello world

    class Program
    {
        static void Main(string[] args)
        {
            // 应用开始...
            var container = new WindsorContainer();

           // 使用windstorinstallers从执行程序集添加和配置所有组件
            container.Install(FromAssembly.This());

            // 实例化依赖
            var king = container.Resolve<IKing>();
            king.RuleTheCastle();
            // clean up, application exits
            container.Release(king);
            container.Dispose();
            Console.Read();
        }
    }
    public class RepositoriesInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Classes.FromThisAssembly()
                                .Where(Component.IsInSameNamespaceAs<King>())
                                .WithService.DefaultInterfaces()
                                .LifestyleTransient());
        }
    }

    public interface IKing
    {
        void RuleTheCastle();
    }
    public class King : IKing
    {
        public void RuleTheCastle()
        {
            Console.WriteLine("调用方法成功啦!!!-=-");
        }
    }

 

 

2.手动注入

  

        /// <summary>
        /// 手动注入
        /// </summary>
        private static void HandlerInit()
        {
            var container = new WindsorContainer();
            container.Register(Component.For<CI1>());
            container.Register(Component.For<I1>().ImplementedBy<C1>());
            container.Register(Component.For<I2>().ImplementedBy<C2>());
            var ci1 = container.Resolve<CI1>();
            container.Release(ci1);
            container.Dispose();
        }
    public interface I1
    {
        void Show1();
    }

    public interface I2
    {
        void Show2();
    }

    public class C1 : I1
    {
        public void Show1()
        {
            Console.WriteLine("C1");
        }
    }
    public class C2 : I2
    {
        public void Show2()
        {
            Console.WriteLine("C2");
        }
    }

    public class CI1
    {
        public CI1(I1 i1, I2 i2)
        {
            i1.Show1();
            i2.Show2();
        }
    }

  这里可以看到CI1 构造函数需要的接口都被注入进来.调用成功

4.在asp.net mvc 中使用

   

public class MvcApplication : System.Web.HttpApplication
    {
        private static WindsorContainer contariner;

        protected void Application_End()
        {
            contariner.Dispose();
        }
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            contariner = new WindsorContainer();
            contariner.Install(FromAssembly.This());
            ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(contariner.Kernel));
        }
    }
   
    public class CustomeWindsorInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());

            container.Register(Component.For<I1>().ImplementedBy<C1>().LifestyleTransient());
           // container.Register(Classes.FromThisAssembly().Where(Component.IsInSameNamespaceAs<C1>()).WithService.DefaultInterfaces().LifestyleTransient());
        }
    }
    public class WindsorControllerFactory : DefaultControllerFactory
    {
        private readonly IKernel kernel;

        public WindsorControllerFactory(IKernel kernel)
        {
            this.kernel = kernel;
        }

        public override void ReleaseController(IController controller)
        {
            kernel.ReleaseComponent(controller);
        }

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
            {
                throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
            }
            return (IController)kernel.Resolve(controllerType);
        }

    }

 5 高级用法

  1.注入泛型

  

        private static void SetGeneric()
        {
            var container = new WindsorContainer();
            container.Register(
                Component.For(typeof(IRespority<>))
                    .ImplementedBy(typeof(BaseRespority<>))
            );
            var rp = container.Resolve<IRespority<String>>();
            container.Release(rp);
            container.Dispose();
        }

   2.设置默认Component

 private static void Repeat() {
            var container = new WindsorContainer();
            container.Register(
                Component.For<r1>().ImplementedBy<cr1>(),//默认为第一个所以一直是cr1
                Component.For<r1>().ImplementedBy<cr2>()//.IsDefault() 可通过加上默认来指定
            );
            var rp = container.Resolve<r1>();
            container.Release(rp);
            container.Dispose();

        }

 3.指定依赖. 当一个类依赖的是接口,但是接口的实例有多个,可用这个处理

  

        /// <summary>
        /// 指定依赖
        /// </summary>
        private static void SetDepden() {

            var container = new WindsorContainer();
            container.Register(
                Component.For<r1>().ImplementedBy<cr1>().Named("r1.c1"),//默认为第一个所以一直是cr1
                Component.For<r1>().ImplementedBy<cr2>().Named("r1.c2")//.IsDefault() 可通过加上默认来指定
                ,Component.For<cc>().DependsOn(ServiceOverride.ForKey("r").Eq("r1.c2"))
            );
            var rp = container.Resolve<cc>();
            container.Release(rp);
            container.Dispose();
        }

4. 类多继承接口

            var container = new WindsorContainer();
            container.Register(
                Component.For<r1, r2>().ImplementedBy<cr1>().Named("r1.c1"),
                Component.For<r1>().ImplementedBy<cr2>().Named("r1.c2").IsDefault()
                , Component.For<cc>().DependsOn(ServiceOverride.ForKey("r").Eq("r1.c2"))
            );
            //接口继承于接口
            container.Register(
                Component.For<r1, r2>().Forward<r3>().ImplementedBy<cr1>()
                );
            var rp = container.Resolve<r1>();
            container.Release(rp);
            container.Dispose();

 5.拦截器

  

 public class LoggingInterceptor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            invocation.Proceed();
            var ttt = invocation.ReturnValue;

        }
    }
    public interface IOrderRepository
    {
        string GetOrder(Guid id);
        string DD();
    }
    [Interceptor(typeof(LoggingInterceptor))]
    public class OrderRepository : IOrderRepository
    {
        public string DD()
        {
            return "1111111111111111";
        }

        public string GetOrder(Guid id)
        {
            return "123123";
            // some implementation
        }
    }

        private static void SetInterceptor()
        {
            var container = new WindsorContainer();
            container.Register(
                Component.For<LoggingInterceptor>().LifeStyle.Transient
                , Component.For<IOrderRepository>().ImplementedBy<OrderRepository>()
            );
            var rp = container.Resolve<IOrderRepository>();
            Console.WriteLine(rp.GetOrder(Guid.NewGuid()));
            Console.WriteLine(rp.DD());
            container.Release(rp);
            container.Dispose();
        }

 

posted @ 2019-10-30 23:16  夏风微凉  阅读(575)  评论(0编辑  收藏  举报