zoukankan      html  css  js  c++  java
  • 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));
                
                    ...............................

     

  • 相关阅读:
    微信公众平台开发(53)砸金蛋
    微信公众平台高级功能
    微信5.0安卓内测版下载
    微信公众平台2013.08.05更新说明
    淘宝微信互相屏蔽影响了谁
    WAP网页输入框的默认键盘类型控制
    如何通过微信创业赚钱
    腾讯风铃
    腾讯推出微信企业服务平台风铃
    一键生成HTML4和WAP站
  • 原文地址:https://www.cnblogs.com/waren168/p/3804461.html
Copyright © 2011-2022 走看看