Castle Windsor 学习-----Installer的几种安装方式

翻译

  当使用依赖注入容器时,你首先要向容器中注册你的组件,Windsor使用installers(该类型实现IWindsorInstaller接口)来封装和隔离注册的逻辑,可以使用Configuration和FromAssembly来完成工作。

  Installers是实现了IWindsorInstaller接口的简单类型,只有一个Install方法,该方法接收container参数,该参数使用 fluent registration API方式来注册组件

  

public class RepositoriesInstaller : IWindsorInstaller
{
   public void Install(IWindsorContainer container, IConfigurationStore store)
   {
      container.Register(AllTypes.FromAssemblyNamed("Acme.Crm.Data")
                            .Where(type => type.Name.EndsWith("Repository"))
                            .WithService.DefaultInterfaces()
                            .Configure(c => c.LifeStyle.PerWebRequest));
   }
}

备注:使用单独的installer来注册一些相关的服务信息(如repositories、controllers)

installer必须是公共的而且包含一个公共的默认构造函数,Windsor使用InstallerFactory扫描公开的installers

使用installers

var container = new WindsorContainer();
container.Install(
   new ControllersInstaller(),
   new RepositoriesInstaller(),
   // and all your other installers
);

当有新的intallers,要记得在这里注册

如果installers过多,添加这些代码有点乏味。Windsor提供FromAssembly静态类和Configuration来进行外部的配置

FromAssembly静态类会扫描指定的程序集中所有实现IWindsorInstaller接口的类,如果添加新的installer,则不用添加额外代码,Windsor会自动检测到类型并实例化

container.Install(
   FromAssembly.This(),
   FromAssembly.Named("Acme.Crm.Bootstrap"),
   FromAssembly.Containing<ServicesInstaller>(),
   FromAssembly.InDirectory(new AssemblyFilter("Extensions")),
   FromAssembly.Instance(this.GetPluginAssembly())
);

installer的注册没有特定的顺序,所以你不知道哪个installer先被注册,如果要进行特殊的排序,使用InstallerFactory来实现

public class WindsorBootstrap : InstallerFactory
    {

        public override IEnumerable<Type> Select(IEnumerable<Type> installerTypes)
        {
            var retval =  installerTypes.OrderBy(x => this.GetPriority(x));
            return retval;
        }

        private int GetPriority(Type type)
        {
            var attribute = type.GetCustomAttributes(typeof(InstallerPriorityAttribute), false).FirstOrDefault() as InstallerPriorityAttribute;
            return attribute != null ? attribute.Priority : InstallerPriorityAttribute.DefaultPriority;
        }

    }

[AttributeUsage(AttributeTargets.Class)]
    public sealed class InstallerPriorityAttribute : Attribute
    {
        public const int DefaultPriority = 100;

        public int Priority { get; private set; }
        public InstallerPriorityAttribute(int priority)
        {
            this.Priority = priority;
        }
    }

container.Install(FromAssembly.This(new WindsorBootstrap()));

给installer添加特性进行排序

1. FromAssembly.This() 调用该方法的程序集2. FromAssembly.Named("Acme.Crm.Bootstrap")   Install from assembly with specified assembly name using standard .NET assembly locating mechanism.   You can also provide path to a .dll or .exe file when you have the assembly in some non-standard location.   如果是.dll,要使用绝对路径3. FromAssembly.Containing    程序集中包含特定的类型

Configuration 类

读取xml文件的配置信息

container.Install(
   Configuration.FromAppConfig(),
   Configuration.FromXmlFile("settings.xml"),
   Configuration.FromXml(new AssemblyResource("assembly://Acme.Crm.Data/Configuration/services.xml"))
);

settings.xml文件格式如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <installers>
    <install type="WindsorInstaller.CustomerInstaller,WindsorInstaller"/>
    <install type="WindsorInstaller.SecondInstaller,WindsorInstaller"/>
  </installers>
</configuration>

Windsor自动获取xml文件中的installers

也可以写在应用程序配置文件中

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
  </configSections>
  <castle>
    <installers>
      <install type="WindsorInstaller.CustomerInstaller,WindsorInstaller"/>
      <install type="WindsorInstaller.SecondInstaller,WindsorInstaller"/>

      <!--查找该程序集下所有IWindsorInstaller接口的类型进行注册-->
      <!--<install assembly="WindsorInstaller"></install>-->

      <!--查找dll文件-->
      <!--<install directory="Extensions" fileMask="*.dll"></install>-->
    </installers>
  </castle>
</configuration>

  

时间: 2024-10-26 21:56:59

Castle Windsor 学习-----Installer的几种安装方式的相关文章

vue.js三种安装方式

Vue.js(读音 /vju?/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手,还便于与第三方库或既有项目整合. 下面介绍三种 Vue.js 的安装方法: 独立版本 我们可以在Vue.js的官网上直接下载vue.js,并在html中通过<script>标签中引用.<script src = ../vue.js> </script> 开发环境不要使用最

Python模块常用的几种安装方式

一.方法1: 单文件模块直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包,进行解压,进入模块文件夹,执行:python setup.py install 三. 方法3:easy_install 方式  先下载ez_setup.py,运行python ez_setup 进行easy_install工具的安装,之后就可以使用easy_install进行安装package了.  easy_install  packageName  easy_i

Hive的三种安装方式(内嵌模式,本地模式远程模式)

一.安装模式介绍:     Hive官网上介绍了Hive的3种安装方式,分别对应不同的应用场景.     1.内嵌模式(元数据保村在内嵌的derby种,允许一个会话链接,尝试多个会话链接时会报错)     2.本地模式(本地安装mysql 替代derby存储元数据)     3.远程模式(远程安装mysql 替代derby存储元数据) 二.安装环境以及前提说明:     首先,Hive是依赖于hadoop系统的,因此在运行Hive之前需要保证已经搭建好hadoop集群环境.     本文中使用的

Linux 下wdcp支持两种安装方式

wdcp支持两种安装方式1 源码编译 此安装比较麻烦和耗时,一般是20分钟至一个小时不等,具体视机器配置情况而定2 RPM包安装 简单快速,下载快的话,几分钟就可以完成源码安装(ssh登录服务器,执行如下操作即可,需root用户身份安装)wget http://dl.wdlinux.cn:5180/lanmp_laster.tar.gztar zxvf lanmp_laster.tar.gzsh install.sh4个可选安装1,2,3 是安装独立的环境,不可自由切换nginx,apache,

grub安装的 三种安装方式

1. 引言 grub是什么?最常态的理解,grub是一个bootloader或者是一个bootmanager,通过grub可以引导种类丰富的系统,如linux.freebsd.windows等.但一旦进入linux操作系统(如无特殊声明,以下提及操作系统或系统皆为linux操作系统),可以敲一个grub命令,就进入”grub>”提示状态,然后可以进入操作若干命令.这时候的grub是什么?是shell,是一个和bash类似的一个shell.并且提供了两种工作模式,交互(interactive)模式

Linux下MySQL的几种安装方式

闲来有空,整理下Linux下Mysql的几种安装方式,分别使用yum/rpm.常规方式编译安装.cmake方式编译安装以及使用二进制方式免编译安装MySQL Linux系统环境: CentOS release 6.5 (Final) x86_64 MySQL版本:5.5.45 安装前关闭了iptables.selinux为disabled 预安装以下包: yum groupinstall "debugging Tools" "Dial-up Networking Suppor

Linux的两种安装方式

Linux的两种安装方式 首先,介绍一下Linux的安装方式,可以是yum安装,也可以是源码包安装. yum安装:简单方便,不易出错. 源码包安装:有点繁琐,但是服务性能好. yum 安装 1. 安装 Nginx yum 安装nginx非常简单,就输入一条命令即可.  $ sudo yum -y install nginx # 安装 nginx  $ sudo yum remove nginx # 卸载 nginx 通过yum安装的时候提示下面的错误  # yum install nginx  

postgresql - 三种安装方式

最近接触了postgresql的安装,和大家分享一下. 一.简 介 PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统.有些特性甚至连商业数据库都不具备.这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目,并且有非常广泛的用户. 优势:http://www.cnblogs.com/zhangpengme/archive/2011/12/01/2271092.html 官网:http:/

ZendFramework 两种安装方式

1. 在线安装(基于composer) Zend 应用程序骨架 GitHub 地址: https://github.com/zendframework/ZendSkeletonApplication php composer.phar self-update php composer.phar install ZendSkeletonApplication.composer 和 Zend Framework 2 这三者之间是什么关系? ZendSkeletonApplication 是 Zend