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 ...
随机推荐
- 【转】Ubuntu乱码解决方案(全)
转自:http://www.cnblogs.com/end/archive/2011/04/19/2021507.html ubuntu下中文乱码解决方案(全) 1.ibus输入法 Ubuntu 系统 ...
- XmlDocument类
XmlDocument类是.NET框架的DOC解析器.XmlDocument将XML视为树状结构,它装载XML文档,并在内存中构建该文档的树状结构.下面来看下XmlDocument提供了哪些功能. 一 ...
- IT国家重点实验室
软件工程国家重点实验室(武汉大学): http://www.sklse.whu.edu.cn/ 南京大学: http://keysoftlab.nju.edu.cn/ 水声技术国家重点实验室 http ...
- poj 3321 Apple Tree(一维树状数组)
题目:http://poj.org/problem?id=3321 题意: 苹果树上n个分叉,Q是询问,C是改变状态.... 开始的处理比较难,参考了一下大神的思路,构图成邻接表 并 用DFS编号 白 ...
- BZOJ3280: 小R的烦恼
题解: 随便建一下图费用流就可以过吧... 代码: #include<cstdio> #include<cstdlib> #include<cmath> #incl ...
- Vim Vundle 插件管理器
/********************************************************************** * Vim Vundle 插件管理器 * 说明: * 话 ...
- Android学习系列(20)--App数据格式之解析Json
JSON数据格式,在Android中被广泛运用于客户端和网络(或者说服务器)通信,非常有必要系统的了解学习. 恰逢本人最近对json做了一个简单的学习,特此总结一下,以飨各位. 为了文 ...
- Js获取Cookie值的方法
function getCookie(name) { var prefix = name + "=" var start = document.cookie.indexOf(pre ...
- 《深入Java虚拟机学习笔记》- 第5章 Java虚拟机
一.JVM的生命周期 当启动一个Java程序时,一个Java虚拟机实例就诞生了:当该程序关闭退出时,这个Java虚拟机也就随之消亡: JVM实例通过调用某个初始类的main方法来运行一个Java程序: ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (五) 如何让窗体记录登录状态Session
在写自动化测试的Node.js脚本时, 时常需要测试所写的case, 可能都需要去重新登录一遍,这将相当的耗时, 好在Selenium都借了Session的机制, 如果在最初的浏览器没有关闭的情况下, ...