Castle IOC FOR MVC 使用方法

Castle Web.API 使用方法

 一、创建 WindsorActivator 继承 IHttpControllerActivator

 

 public class WindsorActivator :IHttpControllerActivator
    {
        private readonly IWindsorContainer container;
        public WindsorActivator(IWindsorContainer container)
        {
            this.container = container;

        }

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

            request.RegisterForDispose(
                new Release(
                    () => this.container.Release(controller)));

            return controller;
        }

        public IController Create(RequestContext requestContext, Type controllerType)
        {
            var controller = (IController)this.container.Resolve(controllerType);
            return controller;

        }




        private class Release : IDisposable
        {
            private readonly Action release;

            public Release(Action release)
            {
                this.release = release;
            }

            public void Dispose()
            {
                this.release();
            }
        }

二、创建 DependencyInstaller 

public class DependencyInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                        Component.For<ILogService>()
                            .ImplementedBy<LogService>()
                            .LifeStyle.PerWebRequest,

                        Component.For<IDatabaseFactory>()
                            .ImplementedBy<DatabaseFactory>()
                            .LifeStyle.PerWebRequest,

                        Component.For<IUnitOfWork>()
                            .ImplementedBy<UnitOfWork>()
                            .LifeStyle.PerWebRequest,

                        AllTypes.FromThisAssembly().BasedOn<IHttpController>().LifestyleTransient(),
                        AllTypes.FromThisAssembly().BasedOn<IController>().LifestyleTransient(),
                        AllTypes.FromAssemblyNamed("WebChat.Service")
                            .Where(type => type.Name.EndsWith("Service")).WithServiceAllInterfaces().LifestylePerWebRequest(),
                        AllTypes.FromAssemblyNamed("WebChat.Repository")
                            .Where(type => type.Name.EndsWith("Repository")).WithServiceAllInterfaces().LifestylePerWebRequest()
                       
                        );


        }

    }

三、在全局代码文件中加入以下代码,就可以了

   public class WebApiApplication : System.Web.HttpApplication
    {

        private readonly IWindsorContainer container;
        private readonly IWindsorContainer containerByCon;

        public WebApiApplication()
        {
            this.container = new WindsorContainer().Install(new DependencyInstaller());
            this.containerByCon = new WindsorContainer().Install(new DependencyInstaller());
        }

        public override void Dispose()
        {
            this.container.Dispose();
            this.containerByCon.Dispose();
            base.Dispose();
        }


        protected void Application_Start()
        {

            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //API注入包
            GlobalConfiguration.Configuration.Services.Replace(
                typeof(IHttpControllerActivator),
                new WindsorActivator(this.container));
            //controller 注入包
            var controllerFactory = new WindsorControllerFactory(containerByCon.Kernel);
            ControllerBuilder.Current.SetControllerFactory(controllerFactory);

        }

 

Castle mvc 使用方法

 一、基本方法同上,但也有区别,Web.api 是由apicontroller来实现的,使用的是 IHttpController 但MVC 使用的是IController ,所以我们要次创建一个针对IController 的注入口 WindsorControllerFactory 

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);
        }
    }

二、然后在“Global”中加入以下代码就可以,如上图个那个 Global 一样的,代码已全部贴出来了。

 var controllerFactory = new WindsorControllerFactory(containerByCon.Kernel);
            ControllerBuilder.Current.SetControllerFactory(controllerFactory);

 

 这样就完成了,可以直接的使用了,使用实例如下:

WEB.API 使用实例:

 public class UserInfoController : ApiController
    {
        IUserInfoService iuserInfoService;
        ILogService ilogService;
        public UserInfoController(IUserInfoService iuserInfoService, ILogService ilogService)
        {
            this.iuserInfoService = iuserInfoService;
            this.ilogService = ilogService;
        }

        [EnableCors]
        public IQueryable<UserInfo> GetUserInfoList()
        {
            IQueryable<UserInfo> uifList;
            uifList = iuserInfoService.GetUserInfoList();
            return uifList;
...........................

 

MVC 使用实例

 public class OAuthController : Controller
    {
        IUserInfoService iuserInfoService;
        ILogService ilogService;
        public OAuthController(IUserInfoService _iuserInfoService, ILogService _ilogService)
        {
            this.iuserInfoService = _iuserInfoService;
            this.ilogService = _ilogService;
        }

        public ActionResult Index(string code)
        {
            ChatUserModel chum = new ChatUserModel();
            if (code != null & code != "")
            {
                ChatUser chu = new ChatUser();
                chum = chu.GetChatUser(code);
                UserInfo newuser = new UserInfo();
                newuser.City = chum.city;
                newuser.UpdataTime = System.DateTime.Now;
                newuser.Remark = "用户绑定";
                int states = iuserInfoService.InsertUserInof(newuser);
                ilogService.Logger().Info(string.Format("add new user by {0} in {1}", newuser.NickName, newuser.UpdataTime));
            
                ...............................

 

 

 

posted on 2014-06-23 17:31  willis_wu  阅读(1680)  评论(2编辑  收藏  举报