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(, 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)); ...............................

 

Castle IOC FOR MVC 使用方法的更多相关文章

  1. Castle IOC容器与Spring.NET配置之比较

    我本人对于Spring.NET并不了解,本文只是通过一个简单的例子来比较一下两者配置之间的区别.在Castle IOC容器中,提出了自动装配(Auto-Wiring)的概念,即由容器自动管理组件之间的 ...

  2. Castle IOC容器组件生命周期管理

    主要内容 1.生命处理方式 2.自定义生命处理方式 3.生命周期处理 一.生命处理方式 我们通常创建一个组件的实例使用new关键字,这样每次创建出来的都是一个新的实例,如果想要组件只有一个实例,我们会 ...

  3. Castle IOC容器内幕故事(下)

    主要内容 1.ComponentModelBuilder 和 Contributors 2.Contributors分析 3.Handles分析 4.ComponentActivator分析 一.Co ...

  4. Castle IOC容器快速入门

    主要内容 1.为什么要IOC 2.什么是Castle IOC容器 3.快速入门示例 4.几个重要的概念 一,为什么要IOC IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已 ...

  5. IOC 在Mvc中的使用

    IOC 在Mvc中的使用 IOC,是控制反转(Inversion of Control)的英文简写, 控制反转一般分为两种类型,依赖注入(Dependency Injection)和依赖查找(Depe ...

  6. 自己动手写Spring框架--IOC、MVC

    对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...

  7. Castle IOC容器构建配置详解(二)

    主要内容 1.基本类型配置 2.Array类型配置 3.List类型配置 4.Dictionary类型配置 5.自定义类型转换 一.基本类型配置 在Castle IOC的配置文件中,大家可能都已经注意 ...

  8. Castle IOC容器构建配置详解(一)

    主要内容 1.配置什么 2.几种配置方式 3.Include 介绍 4.Properties介绍 5.条件状态 一.配置什么 Castle IOC中并不像Spring.net那样贯穿着一个思想就是一切 ...

  9. SpringMVC(八):使用Servlet原生API作为Spring MVC hanlder方法的参数

    在SpringMVC开发中,是有场景需要在Handler方法中直接使用ServletAPI. 在Spring MVC Handler的方法中都支持哪些Servlet API作为参数呢? --Respo ...

随机推荐

  1. Git教程(5)常用技巧之本地分支

    http://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%80%E4%BB%8B 基础 Git 研发组 ...

  2. android 页面滑动 ViewFlipper,OnGestureListener,OnTouchListener

    public class Main extends Activity implements OnGestureListener, OnTouchListener { // 一般不直接使用ViewAni ...

  3. 【HDOJ】4426 Palindromic Substring

    综合性很强的一道题目,结合manacher,后缀数组,哈希,RMQ,二分可解.基本思路是通过manacher可以找到所有可能的回文串,哈希去重,后缀数组二分找数目.最后暴力求解.需要注意kth需要为_ ...

  4. poj 3259 Wormholes(最短路 Bellman)

    题目:http://poj.org/problem?id=3259 题意:一个famer有一些农场,这些农场里面有一些田地,田地里面有一些虫洞,田地和田地之间有路,虫洞有这样的性质: 时间倒流.问你这 ...

  5. BZOJ1758: [Wc2010]重建计划

    题解: 这题我居然做了一星期?... 平均值的极值其实也可以算是一种分数规划,只不过分母上b[i]=1 然后我们就可以二分这个值.类似与 HNOI最小圈 如果没有 链的长度的限制的话,我们直接两遍df ...

  6. POJ 1017 Packets

    题意:有一些1×1, 2×2, 3×3, 4×4, 5×5, 6×6的货物,每个货物高度为h,把货物打包,每个包裹里可以装6×6×h,问最少几个包裹. 解法:6×6的直接放进去,5×5的空隙可以用1× ...

  7. How to cancel parallel loops in .NET C# z

    Cancellation token Parallel options CancellationTokenSource cancellationTokenSource = new Cancellati ...

  8. POJ3087 Shuffle'm Up 简单模拟

    题意:就是给你两副扑克,然后一张盖一张洗牌,不断重复这个过程,看能不能达到目标的扑克顺序 分析:然后就模拟下,-1的情况就是有循环节 #include<cstdio> #include&l ...

  9. Codeforces 611C New Year and Domino DP+容斥

    "#"代表不能放骨牌的地方,"."是可以放 500*500的矩阵,q次询问 开两个dp数组,a,b,a统计横着放的方案数,b表示竖着放,然后询问时O(1)的,容 ...

  10. 《转》高级Unix命令

    原文链接:http://coolshell.cn/articles/1044.html 在Unix操作中有太多太多的命令,这些命令的强大之处就是一个命令只干一件事,并把这件事干好.Do one thi ...