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(, 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 使用方法的更多相关文章
- Castle IOC容器与Spring.NET配置之比较
我本人对于Spring.NET并不了解,本文只是通过一个简单的例子来比较一下两者配置之间的区别.在Castle IOC容器中,提出了自动装配(Auto-Wiring)的概念,即由容器自动管理组件之间的 ...
- Castle IOC容器组件生命周期管理
主要内容 1.生命处理方式 2.自定义生命处理方式 3.生命周期处理 一.生命处理方式 我们通常创建一个组件的实例使用new关键字,这样每次创建出来的都是一个新的实例,如果想要组件只有一个实例,我们会 ...
- Castle IOC容器内幕故事(下)
主要内容 1.ComponentModelBuilder 和 Contributors 2.Contributors分析 3.Handles分析 4.ComponentActivator分析 一.Co ...
- Castle IOC容器快速入门
主要内容 1.为什么要IOC 2.什么是Castle IOC容器 3.快速入门示例 4.几个重要的概念 一,为什么要IOC IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已 ...
- IOC 在Mvc中的使用
IOC 在Mvc中的使用 IOC,是控制反转(Inversion of Control)的英文简写, 控制反转一般分为两种类型,依赖注入(Dependency Injection)和依赖查找(Depe ...
- 自己动手写Spring框架--IOC、MVC
对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...
- Castle IOC容器构建配置详解(二)
主要内容 1.基本类型配置 2.Array类型配置 3.List类型配置 4.Dictionary类型配置 5.自定义类型转换 一.基本类型配置 在Castle IOC的配置文件中,大家可能都已经注意 ...
- Castle IOC容器构建配置详解(一)
主要内容 1.配置什么 2.几种配置方式 3.Include 介绍 4.Properties介绍 5.条件状态 一.配置什么 Castle IOC中并不像Spring.net那样贯穿着一个思想就是一切 ...
- SpringMVC(八):使用Servlet原生API作为Spring MVC hanlder方法的参数
在SpringMVC开发中,是有场景需要在Handler方法中直接使用ServletAPI. 在Spring MVC Handler的方法中都支持哪些Servlet API作为参数呢? --Respo ...
随机推荐
- 在VS中让一个JS文件智能提示另一个JS文件中的成员
“在VS中如何让一个JS文件智能提示另一个JS文件中的成员” 有时候会有这种情况:当我的一个Web页面引用了两个JS文件(假如分别叫common.js和JScript1.js),如果JScript1. ...
- Export BOM - BOMPXINQ.EXPLODER_USEREXIT API
--======================================================================== -- Procedure : explode ...
- C语言动态生成二维数组
# 动态创建二维数组示例 #include "stdlib.h" #include "stdio.h" #include <malloc.h> in ...
- python操作Excel读--使用xlrd
一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境. 二.使用介绍 1.导入模块 import x ...
- C++ volatile的作用
volatile的作用 2006-10-23 13:44:21 大 中 小 关键在于两个地方: 1. 编译器的优化 (请高手帮我看看下面的理解) 在本次线程内, 当读取一个变量时,为提 ...
- 根据block取出space_id
/*********************************************************************//** Gets the space id of a bl ...
- CodeForces Round #286 Div.2
A. Mr. Kitayuta's Gift (枚举) 题意: 给一个长度不超过10的串,问能否通过插入一个字符使得新串成为回文串. 分析: 因为所给的串很多,所以可以枚举 “在哪插入” 和 “插入什 ...
- I.MX6 wm8962 0-001a: DC servo timed out
/******************************************************************************* * I.MX6 wm8962 0-00 ...
- POJ 3678 Katu Puzzle (2-SAT,常规)
题意:给出n个点,每个点上有一个数字可以0或1,然后给出m条限制,要求a和b两个点上的数字满足 a op b = c,op和c都是给定.问是否能够有一组解满足所有限制?(即点上的数字是0是1由你决定) ...
- (八)学习CSS之line-style-type属性
参考:http://www.w3school.com.cn/cssref/pr_list-style-type.asp 设置不同的列表样式: ul.circle {list-style-type:ci ...