Castle.Windsor 在MVC与WebApi中如何进行IOC

Castle.Windsor在Web.Mvc中使用

  • 1.建立Controller构造器工厂
    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);
        }
    }
  • 2.构造Controller的Installer
    public class ControllerInstaller:IWindsorInstaller
    {
        public void Install(IWindsorContainer container,IConfigurationStore store)
        {
            container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
        }
    }
  • 3.构建容器,安装installers,设置mvc Controller的默认构建工厂
//如下内容在 `Global.asax.cs` 文件中
private static IWindsorContainer container;
protected void Application_Start()
{
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        //初始化容器,并且自动安装Installers
        container = new WindsorContainer()
        .Install(FromAssembly.This());
        //这里还可以放置七七八八的注册方式等

        //实例化Mvc-Controller工厂
        var controllerFactory = new WindsorControllerFactory(container.Kernel);

        //设置默认的控制器构造
        ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
protected void Application_End()
{
    //容器释放
    container.Dispose();
}

Castle.Windsor在Web.Api中使用

  • 1.建立新的Windsor服务解析替代默认的Webapi服务解析
    public class WindsorDependencyResolver:System.Web.Http.Dependencies.IDependencyResolver
    {
        private readonly IWindsorContainer container;
        public WindsorDependencyResolver(IWindsorContainer container)
        {
            this.container = container;
        }
        public IDependencyScope BeginScope()
        {
            return new DependencyScope(container.Kernel);
        }

        public object GetService(Type serviceType)
        {
            return container.Resolve(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return container.ResolveAll(serviceType).Cast<object>();
        }

        public void Dispose()
        {
            container.Dispose();
        }
    }

    //这里需要用到Ikernel的扩展函数, using Castle.MicroKernel.Lifestyle;
    public class DependencyScope:IDependencyScope
    {
        private readonly IKernel kernel;
        private readonly IDisposable disposable;
        public DependencyScope(IKernel kernel)
        {
            this.kernel = kernel;
            disposable=kernel.BeginScope();
        }
        public object GetService(Type serviceType)
        {
            return kernel.Resolve(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return kernel.ResolveAll(serviceType).Cast<object>();
        }

        public void Dispose()
        {
            disposable.Dispose();
        }
    }
  • 2.创建WepApi的WindsorInstaller
    public class WebApiInstaller:IWindsorInstaller
    {
        public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
        {
            container.Register(
                Classes.FromThisAssembly()
                .BasedOn<ApiController>()
                .LifestyleScoped()
                );
        }
    }
  • 3.初始化Windsor容器,指定WebApi的服务解析
//在Global.asax文件中
private static IWindsorContainer container;
protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);

    //初始化Windsor容器
    container = new WindsorContainer();
    container.Install(FromAssembly.This());

    //设置WebApi默认的服务解析
    GlobalConfiguration.Configuration.DependencyResolver = new WindsorDependencyResolver(container);
}
protected void Application_End()
{
    container.Dispose();
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值