MVC中使用Castle.Windsor
我在MVC中使用Castle.Windsor是这样用的。
首先在UI层安装Install Castle.Windsor
在App_Start中增加一个类WindsorActivator,用于注册和销毁Containter。注意,这里是在PreApplicationStartMethod中注册的,是在ApplicationShutdownMethod中销毁的。
using Castle.Windsor;
using Castle.Windsor.Installer;
using System;
using WebActivatorEx; [assembly: PreApplicationStartMethod(typeof(TaskManagement.UI.App_Start.WindsorActivator), "PreStart")]
[assembly: ApplicationShutdownMethodAttribute(typeof(TaskManagement.UI.App_Start.WindsorActivator), "Shutdown")] namespace TaskManagement.UI.App_Start
{
public static class WindsorActivator
{
public static IWindsorContainer Container; public static void PreStart()
{
//将这个Assembly中所有实现IWindsorInstaller接口的类都注册
Container = new WindsorContainer().Install(FromAssembly.This());
} public static void Shutdown()
{
if (Container != null)
Container.Dispose();
}
}
}
新建一个Installers文件夹,在该文件夹中分别添加多个Installer文件,用于注册DA、Service、Infrastructure层的内容,举例ServiceInstaller.cs文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
using TaskManagement.Service.Implementation; namespace TaskManagement.UI.Installers
{
public class ServiceInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
//container.Register(Classes.FromThisAssembly()
// .IncludeNonPublicTypes()
// .BasedOn<ITransient>()
// .WithService.DefaultInterfaces()
// .LifestyleTransient()); container.Register(Classes.FromAssemblyNamed("TaskManagement.Service")
//.IncludeNonPublicTypes()
.BasedOn<BaseService>()
.WithService
.DefaultInterfaces() //使用默认的I+ServiceName的方式来取Service
.LifestylePerWebRequest());
//.LifestyleTransient());
}
}
}
其中ControllerInstaller比较特殊:
using System.Web.Mvc;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor; namespace TaskManagement.UI.Installers
{
using Plumbing; public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
//container.Register(
// Classes.
// FromThisAssembly().
// BasedOn<IController>().
// If(c => c.Name.EndsWith("Controller")).
// LifestyleTransient()); //ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container)); container.Register(Classes.FromThisAssembly().
BasedOn<IController>().
If(c => c.Name.EndsWith("Controller"))
.LifestyleTransient()); container.Register(Classes.FromThisAssembly()
.BasedOn<Controller>()
.LifestyleTransient()
);
//设置指定的Controller的工厂,以替代系统默认的工厂
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));
}
}
}
需要额外的一个工厂类来取代默认的DefaultControllerFactory:
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Castle.Windsor; namespace TaskManagement.UI.Plumbing
{
public class WindsorControllerFactory : DefaultControllerFactory
{
readonly IWindsorContainer container; public WindsorControllerFactory(IWindsorContainer container)
{
this.container = container;
} protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType != null && container.Kernel.HasComponent(controllerType))
return (IController)container.Resolve(controllerType); return base.GetControllerInstance(requestContext, controllerType);
} public override void ReleaseController(IController controller)
{
container.Release(controller);
}
}
}
DefaultControllerFactory
使用:
1、属性注册
public class RoleS : BaseService, IRoleS
{
public IRoleR _IRoleR { get; set; }
public IViewR _IViewR { get; set; }
public IViewActionR _IViewActionR { get; set; }
直接使用即可,注意接口要申明为Public的。
2、构造函数注册。可能在测试、外部调用、Windows服务等情况下用到。
public class ChangeLogS : BaseService, IChangeLogS
{
public IChangeLogR _IChangeLogR { get; set; }
public ChangeLogS(IChangeLogR iChangeLogR)
{
_IChangeLogR = iChangeLogR;
}
3、UI层的Help 类中使用
var _IDepartmentR = WindsorActivator.Container.Kernel.Resolve<IDepartmentR>();
MVC中使用Castle.Windsor的更多相关文章
- 在ASP.NET MVC中使用Castle Windsor
平常用Inject比较多,今天接触到了Castle Windsor.本篇就来体验其在ASP.NET MVC中的应用过程. Visual Studio 2012创建一个ASP.NET MVC 4网站. ...
- Castle Windsor 使MVC Controller能够使用依赖注入
以在MVC中使用Castle Windsor为例 1.第一步要想使我们的Controller能够使用依赖注入容器,先定义个WindsorControllerFactory类, using System ...
- ASP.NET MVC Castle Windsor 教程
一.[转]ASP.NET MVC中使用Castle Windsor 二.[转]Castle Windsor之组件注册 平常用Inject比较多,今天接触到了Castle Windsor.本篇就来体验其 ...
- 依赖注入容器之Castle Windsor
一.Windsor的使用 Windsor的作为依赖注入的容器的一种,使用起来比较方便,我们直接在Nuget中添加Castle Windsor,将会自动引入Castle.Core 和 Castle.Wi ...
- 说说ABP项目中的AutoMapper,Castle Windsor(痛并快乐着)
这篇博客要说的东西跟ABP,AutoMapper和Castle Windsor都有关系,而且也是我在项目中遇到的问题,最终解决了,现在的感受就是“痛并快乐着”. 首先,这篇博客不是讲什么新的知识点,而 ...
- Castle Windsor 项目中快速使用
Castle Windsor 项目中快速使用 新建项目如下: 一个模型类,一个接口,一个实现方法.我的目的很明确就是在UI层通过Castle 调用数据访问层的方法. 添加项目引用 CastleDemo ...
- Castle Windsor常用介绍以及其在ABP项目的应用介绍
最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...
- 在ABP项目的应用Castle Windsor
Castle Windsor常用介绍以及其在ABP项目的应用介绍 最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castl ...
- IOC 容器在 ASP.NET MVC 中的应用
IOC 容器在 ASP.NET MVC 中的应用 IOC:Inversion Of Control 翻译为控制反转,我们在面向对象软件开发过程中,一个应用程序它的底层结构可能由N种不同的构件来相互协作 ...
随机推荐
- Java中对比两个对象中属性值[反射、注解]
在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪 ...
- [H5-Compress-Image]利用canvas实现 javascript 图片压缩处理_基于requirejs模块化的代码实现
// 还存在有问题的代码,问题在于processFile()中// 问题:在ipone 5c 下,某些图片压缩处理后,上传到服务器生成的文件size为0,即是空白 ;define(['mod/tool ...
- hadoop2.6 上hive运行 报“native-lzo library not available”异常处理
环境:Hadoop 2.6.0 + hive-0.14.0 问题出现的背景:在hive中建表 (建表语句如下),并且表的字段中有Map,Set,Collection等集合类型. CREATE EXT ...
- 隐式等待-----Selenium快速入门(九)
有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败.在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现 ...
- Unix下cp、tar、sudo命令的使用
环境 Ubuntu14.04 (这里用这样一个类Unix系统来代替Unix,sudo命令也是linux下的一个命令) 实例 : Ubuntu firefox flash插件的安装 到Adobe下载ta ...
- Smarty的原理_面试
Smarty是一个模板引擎,使用smarty主要是为了实现逻辑和外在内容的分离,如果不使用模板的话,通常的做法就是php代码和html代码混编.使用了模板后,则可以将业务逻辑放到php文件中,而负责显 ...
- 在.net core Mvc中使用Options和IOptionsSnapshot
1.Startup.cs 下代码 using System; using System.Collections.Generic; using System.Linq; using System.Thr ...
- 通过sessionStorage来根据屏幕宽度变化来加载不同的html页面
因为项目需要,分别写了移动端和PC端的两个html页面,现在需要根据不同的屏幕宽度来加载对应的页面. 先说一下本人的思路-- 刚开始我直接在加载页面的时候判断屏幕宽度,然后加载相应的页面,大家是不是也 ...
- 冒泡排序实现(Java)
冒泡排序是一种交换排序,它的基本思路是: 两两比较相邻记录的关键字,如果反序则交换,知道没有反序的记录位置. 依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数, ...
- 12、xamarin form中实现H5 网页唤醒微信支付的方法
在微信的支付中有种支付叫微信H5支付.方便用户在网页中轻松唤起微信进行支付. 当然微信不推荐大家使用这样的方式唤起微信支付.建议app还是使用正常的微信支付sdk即可 服务端与其他的建议参考微信支付官 ...