MVC Castle依赖注入实现代码


1、MVc 实现依赖注入


public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKernel _kernel; public WindsorControllerFactory(IKernel kernel) { _kernel = kernel; } protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, System.Type controllerType) { if (controllerType == null) { throw new HttpException(404, string.Format("当前对{0}的请求不存在", requestContext.HttpContext.Request.Path)); } return (IController)_kernel.Resolve(controllerType); } public override void ReleaseController(IController controller) { _kernel.ReleaseComponent(controller); base.ReleaseController(controller); }
}


 public class ControllerInstaller : IWindsorInstaller
    {

        public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
        {

            container.Register(Classes.FromThisAssembly() //在哪里找寻接口或类

               .BasedOn<IController>() //实现IController接口

               .If(Component.IsInSameNamespaceAs<HomeController>()) //与HomeController在同一个命名空间

               .If(t => t.Name.EndsWith("Controller")) //以"Controller"结尾

               .Configure(c => c.LifestylePerWebRequest()));//每次请求创建一个Controller实例



            container.Register(
             Component.For<IUserDal>().ImplementedBy<UserDal>().LifestylePerWebRequest());

        }

    }

Global.asax 文件进行注册

 

  public class MvcApplication : System.Web.HttpApplication
    {

        private IWindsorContainer _container;
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            //初始化一个IOC容器
            _container = new WindsorContainer().Install(FromAssembly.This());

            //完成IWindsorInstaller接口中的注册
            ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(_container.Kernel));

        }

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

        }


       

    }

 


2、web api 依赖注入实现
一、创建 WindsorActivator 继承 IHttpControllerActivator
 
public class WindsorCompositionRoot : IHttpControllerActivator
    {
        private readonly IWindsorContainer _container;

        public WindsorCompositionRoot(IWindsorContainer container)
        {
            _container = container;
        }

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

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

            return controller;
        }
        private sealed class Release : IDisposable
        {
            private readonly Action _release;

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

            public void Dispose()
            {
                _release();
            }
        }
}

 public class RepositoriesInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                Component.For<ITitemService>().ImplementedBy<TitemService>().LifestylePerWebRequest());
            
        }

    }


Global.asax 文件注册

 public class WebApiApplication : System.Web.HttpApplication
    {
        private static IWindsorContainer _container;
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            //api 初始化
            ConfigureWindsor(GlobalConfiguration.Configuration);
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

         
        }


        public static void ConfigureWindsor(HttpConfiguration configuration)
        {
            _container = new WindsorContainer();
            _container.Install(FromAssembly.This());
            _container.Kernel.Resolver.AddSubResolver(new CollectionResolver(_container.Kernel, true));
             RegisterControllerActivator(_container);
}
}
      private static void RegisterControllerActivator(IWindsorContainer container)
        {
            GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator),
                new WindsorCompositionRoot(container));
        }

 



}

 

 

 




 








 

posted @ 2016-09-29 18:16  JIM.WEN  阅读(914)  评论(0编辑  收藏  举报