[Practice Note] CastleWindsor

Nuget引用

添加 Castle.Windsor

MVC项目

添加WindsorControlFactory.cs类,重构控制器生成

namespace castle.IOC
{
    public class WindsorControlFactory:DefaultControllerFactory
    {
        private readonly IKernel _kernel;

        public WindsorControlFactory(IKernel kernel)
        {
            _kernel = kernel;
        }

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
                throw new HttpException(404, string.Format("未找到对应的路径'{0}'", requestContext.HttpContext.Request.Path));

            return (IController)_kernel.Resolve(controllerType);
            //return base.GetControllerInstance(requestContext, controllerType);
        }

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

注册组件

namespace castle.IOC
{
    public class WindsorControlInstaller : IWindsorInstaller
    {
        
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            //throw new NotImplementedException();
            container.Register(
                Classes.FromThisAssembly()    //寻找接口或类的地方
                .BasedOn<IController>()       //实现IController接口 
                //.If(Component.IsInSameNamespaceAs<HomeController>())
                //.If(c=>c.Name.EndsWith("Controller"))
                .Configure(_=>_.LifestyleTransient())
                );

            container.Register(
                Component.For<IPersonService>().ImplementedBy<PersonService>().LifestyleTransient()

                );
        }
    }
}

修改Gloabal.asax.cs

namespace castle
{
    public class MvcApplication : System.Web.HttpApplication
    {
        private IWindsorContainer _container;
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            
			//初始化容器
            _container = new WindsorContainer().Install(FromAssembly.This());
            ControllerBuilder.Current.SetControllerFactory(new WindsorControlFactory(_container.Kernel));
        }

        protected void Application_End()
        {
            _container.Dispose();
        }
    }
}

API项目

新建WindsorActivator.cs类,继承IHttpControllerActivator,主要实现Controller的Create方法

namespace CastleAPI.IOC
{
    public class WindsorActivator : IHttpControllerActivator
    {
        private readonly IWindsorContainer _container;
        public WindsorActivator(IWindsorContainer container)
        {
            _container = container;
        }

        private class Release : IDisposable
        {
            private readonly Action _release;

            public Release(Action release)
            {
                _release = release;
            }

            public void Dispose()
            {
                _release();
            }
        }
        public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
        {
            var controller = (IHttpController)_container.Resolve(controllerType);

            request.RegisterForDispose(new Release(() => _container.Release(controller)));
            //throw new NotImplementedException();

            return controller;
        }
    }
}

添加注册类:WindsorInstaller 继承IWindsorInstaller

namespace CastleAPI.IOC
{
    public class WindsorInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
            Classes.FromThisAssembly()
            .BasedOn<ApiController>()
            .LifestyleTransient()
                );

            container.Register(
                Component.For<IPersonService>().ImplementedBy<PersonService>().LifestyleTransient()
                );
        }
    }
}

全局Gobal.asax.cs文件注册

namespace CastleAPI
{
    public class WebApiApplication : System.Web.HttpApplication
    {
    	//全局容器
        private static IWindsorContainer _container;
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
			//
            WindsorConfig();
        }

        public static void WindsorConfig()
        {
        	_container = new WindsorContainer();
            _container.Install(FromAssembly.This());
            _container.Kernel.Resolver.AddSubResolver(
                new CollectionResolver(_container.Kernel, true));
			GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorActivator(_container));
        }
    }
}

调试的时候注意控制器是继承了 Controller还是ApiController!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值