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>();
时间: 2024-08-27 19:42:53

MVC中使用Castle.Windsor的相关文章

在ASP.NET MVC中使用Castle Windsor

平常用Inject比较多,今天接触到了Castle Windsor.本篇就来体验其在ASP.NET MVC中的应用过程. Visual Studio 2012创建一个ASP.NET MVC 4网站. 通过NuGet安装Castle Windsor. 在当前项目下创建一个名称为"IOC"的文件夹. 在ASP.NET MVC中,每次请求,DefaultControllerFactory都会为我们创建controller实例,我们需要自定义一个派生自DefaultControllerFact

在ABP项目的应用Castle Windsor

Castle Windsor常用介绍以及其在ABP项目的应用介绍 最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载Castle.Windsor所需要的dll,在程序包管理器控制台 运行Install-Package Castle.Windsor 下面先看个简单的例子 1 2 3 4 5 6 7 8 var container = new Wind

IOC 容器在 ASP.NET MVC 中的应用

IOC:Inversion Of Control 翻译为控制反转,我们在面向对象软件开发过程中,一个应用程序它的底层结构可能由N种不同的构件来相互协作来完成我们定义的系统的业务逻辑.哪么每一个构件可能相互独立和相互依赖,如果相互依赖的构件中的某一个构件出现异常,就会影响到整个系统的稳定运行,对象之间的耦合关系是无法避免的,也是必要的,因为这是协同工作的基础.如何降低系统之间.模块之间和对象之间的耦合度,是软件工程永远追求的目标之一.为了解决对象之间的耦合度过高的问题,IOC 的理念被提出,并被成

Castle.Windsor IOC/AOP的使用

Castle最早在2003年诞生于Apache Avalon项目,目的是为了创建一个IOC(控制反转)框架.发展到现在已经有4个组件了,分别是ActiveRecord(ORM组件).Windsor(IOC组件).DynamicProxy(动态代理组件).MonoRail(Web MVC组件). 这里我们要学习的是Windsor组件,Windsor是Castle提供的一个IOC框架. 使用之前,首先需要引用两个DLL,分别是:Castle.Core 和 Castle.Windsor. IOC(控制

Castle Windsor常用介绍以及其在ABP项目的应用介绍

最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载Castle.Windsor所需要的dll,在程序包管理器控制台 运行Install-Package Castle.Windsor 下面先看个简单的例子 var container = new WindsorContainer(); container.Register( Component.For

在ASP.NET MVC4中配置Castle

Castle是针对.NET平台的一个非常优秀的开源项目,重点是开源的哦.它在NHibernate的基础上进一步封装,其原理基本与NHibernate相同,但它较好地解决NHibernate的缺陷,从ORM(对象关系映射)到IOC(inversion of control,控制反转)容器,再到web层的MVC框架,基本上包括整个开发过程的所有内容. 在VS2013 MVC4+SQL Server 2008的环境下配置Castle可以简单分为如下4个步骤 (一)引用Castle,有两种方式 可以直接

c# Castle Windsor简单例子

Windsor是Castle的IOC框架.需要用到两个dll(Castle.Core.dll和Castle.Windsor.dll). 1.接口以及接口实现类: public interface ITest { int Add(int a, int b); } public class Test:ITest { public int Add(int a, int b) { return a + b; } } 2.创建自定义类WindsorInstaller,继承IWindsorInstaller

对Castle Windsor的Resolve方法的解析时new对象的探讨

依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 带参但参数不是靠依赖注入的构造函数 带参且参数是靠依赖注入的构造函数 有多个带参且参数是靠依赖注入的构造函数 带着这个问题,我写了一段测试代码. 测试1: 只有一个无参构造函数: CtorTest类(在控制台程序里用Windsor解析这个类) public class CtorTest { pub

ASP.NET Web API - 使用 Castle Windsor 依赖注入

示例代码 项目启动时,创建依赖注入容器 定义一静态容器 IWindsorContainer 1 private static IWindsorContainer _container; 在 Application_Start() 中,创建该容器 1 _container = new WindsorContainer(); 调用 Container Install 方法,向容器内注册组件 1 _container.Install(FromAssembly.This()); 该语句会调用整个程序集中