【转】Castle Windsor之组件注册

注册方式较多,大体有这么几种,学习得比较粗浅,先记录:

1、逐个注册组件
即对每个接口通过代码指定其实现类,代码:

container.Register(
Component.For<IMyService>() //接口
.ImplementedBy<MyService>() //实现类
);

典型应用场景:例如定义了一个日志记录接口,放到一个独立程序集中。具体实现可能有多种方式(日志以文本文件/XML文件/数据库等不同方式存储),则可以为每个实现类建立一个独立的程序集,在各程序集中将自身注册为接口的实现。这样当我们需要日志的某个存储形式时,选择对应的dll即可

2、按规则批量注册
和1比较类似,不同的是,不用逐个指定接口和实现类,而是指定一个规则,Windsor会用规则去匹配和注册当前应用中所有程序集。代码:

container.Register(Classes.FromThisAssembly()	//当前程序集,也可以调用其它方法,如FromAssemblyInDirectory()等
.InSameNamespaceAs<RootComponent>() //与RootComponent类具有相同的命名空间,还可以用InNamespace("Com.Spbdev")直接指定命名空间
.WithService.DefaultInterfaces()
.LifestyleTransient()); //生命周期

3、按程序集安装注册
与按照规则批量注册类似,差别在于每个程序集内部自己实现一个IWindsorInstaller接口来定义注册规则。也就是将注册规则下放到程序集。
首先,需要指定对哪些程序集进行安装注册(只指定对程序集的搜索规则):
container.Install(FromAssembly.InDirectory(new AssemblyFilter("Extensions")));//Extensions目录下的所有程序集。

其次,每个程序集内通过一个或多个实现了IWindsorInstaller接口的类,来定义哪些Interface和实现类要注册到容器。
如下代码是官网上的一个范例:

public class RepositoriesInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly()
.Where(Component.IsInSameNamespaceAs<RepositoriesInstaller>())
.WithService.DefaultInterfaces()
.LifestyleTransient());
}
}

意思是当前程序集中,与RepositoriesInstaller具有相同命名空间的接口、实现,都注册到IOC容器中。

4、XML配置文件注册
用构造函数方式注册:

IWindsorContainer container = new WindsorContainer("dependencies.config");

或通过Install方法

container.Install(
Configuration.FromXmlFile("dependencies.config"));

二、

 安装的配置

安装的配置比较简单,无非是寻找安装类,并执行安装并获取容器,所有的安装类都需要继承自IWindsorInstaller,此接口规定了方法如下:

void Install(IWindsorContainer container, IConfigurationStore store)

此方法用于执行容器里具体类的注册,类注册将在下面学习。首先看看安装的配置:

WindsorContainer _container = new WindsorContainer();
_container.Install(
FromAssembly.This(),
//FromAssembly.Named("CastleWindsor"),
//FromAssembly.Containing<ServicesInstaller>(),
//FromAssembly.InDirectory(new AssemblyFilter("Extensions")),
//FromAssembly.Instance(this.GetPluginAssembly())
);

以上用install方法的每一个参数对应的配置均会被加载,如果即传入了FromAssembly.This()又传入了 FromAssembly.Named("CastleWindsor"),那么程序集CastleWindsor里的实现类将会被重复注册抛错,所以得小心不能重复注册相同的实现类。

实现类的配置

        实现类的配置多种多样,根据实际需求可组合出不同的配置方式,以下就学习下一些常见的配置,高级配置可自行参考官方文档http://docs.castleproject.org/Windsor.Fluent-Registration-API-Extensions.ashx

要想配置实现类到容易必须新建一个安装类并在安装类的install方法下配置,如下:

<pre name="code" class="csharp">    public class ChargeInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
//container.Register(
// Component.For<IPrinter>().ImplementedBy<WenZhouPrinter>(),
// Component.For<ICharge>().ImplementedBy<WenZhouCharge>()); //container.Register(Classes.FromThisAssembly().InNamespace("CastleWindsor.IEntity").WithService.DefaultInterfaces()); WenZhouPrinter wz = new WenZhouPrinter();
container.Register(
Component.For<LoggingInterceptor>().LifeStyle.Transient,
Component.For<IFactory>().ImplementedBy<PrintFactory>(),
Component.For<IPrinter>().UsingFactoryMethod(p => p.Resolve<IFactory>().GetPrint()),
Component.For<ICharge>().ImplementedBy<WenZhouCharge>()
.DependsOn(Dependency.OnValue("twitterApiKey", "123"))
); //继承两个接口
// container.Register(
// Component.For<IUserRepository, IRepository>()
// .ImplementedBy<MyRepository>()
//);
//简单工厂
//container
// .Register(
// Component.For<IMyService>()
// .UsingFactoryMethod(
// () => MyLegacyServiceFactory.CreateMyService())
// ); // 泛型配置
//container.Register(
// Component.For(typeof(IRepository<>)
// .ImplementedBy(typeof(NHRepository<>)
//); //实体生命周期
//container.Register(
// Component.For<IMyService>()
// .ImplementedBy<MyServiceImpl>()
// .LifeStyle.Transient
//.Named("myservice.default")
// ); //取先注册的
//container.Register(
// Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
// Component.For<IMyService>().ImplementedBy<OtherServiceImpl>()
//); //强制取后注册的
//container.Register(
// Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
// Component.For<IMyService>().Named("OtherServiceImpl").ImplementedBy<OtherServiceImpl>().IsDefault()
//); //注册已经存在的
//var customer = new CustomerImpl();
//container.Register(
// Component.For<ICustomer>().Instance(customer)
// );
}
}

配置中可以使用UsingFactoryMethod来将对应的接口的工厂方法注册到容器中,容器可通过该工厂方法获取实现类,以上分别有简单工厂和工厂方法的配置。

通过DependsOn(Dependency.OnValue("twitterApiKey", "123")可向实现类的字段twitterApiKey注入”123“字符串值。

通过设置IsDefault来规定多个实现类的默认获取过来的类。

【转】Castle Windsor之组件注册的更多相关文章

  1. ASP.NET MVC Castle Windsor 教程

    一.[转]ASP.NET MVC中使用Castle Windsor 二.[转]Castle Windsor之组件注册 平常用Inject比较多,今天接触到了Castle Windsor.本篇就来体验其 ...

  2. Castle Windsor 注册组件

    1.逐个注册组件即对每个接口通过代码指定其实现类,代码: container.Register( Component.For<IMyService>() //接口 .Implemented ...

  3. [Castle Windsor]学习依赖注入

    初次尝试使用Castle Windsor实现依赖注入DI,或者叫做控制反转IOC. 参考: https://github.com/castleproject/Windsor/blob/master/d ...

  4. IoC - Castle Windsor 2.1

    找过一些Windsor教程的文章,博客园上TerryLee有写了不少,以及codeproject等也有一些例子,但都讲的不太明了.今天看到Alex Henderson写的一个系列,非常简单明了.下面是 ...

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

    翻译 当使用依赖注入容器时,你首先要向容器中注册你的组件,Windsor使用installers(该类型实现IWindsorInstaller接口)来封装和隔离注册的逻辑,可以使用Configurat ...

  6. 依赖注入容器之Castle Windsor

    一.Windsor的使用 Windsor的作为依赖注入的容器的一种,使用起来比较方便,我们直接在Nuget中添加Castle Windsor,将会自动引入Castle.Core 和 Castle.Wi ...

  7. Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0

    [转]Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0 1. 使用代码方式进行组件注册[依赖服务类] using System; using System.Co ...

  8. Castle.Windsor IOC/AOP的使用

    Castle最早在2003年诞生于Apache Avalon项目,目的是为了创建一个IOC(控制反转)框架.发展到现在已经有4个组件了,分别是ActiveRecord(ORM组件).Windsor(I ...

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

    示例代码 项目启动时,创建依赖注入容器 定义一静态容器 IWindsorContainer private static IWindsorContainer _container; 在 Applica ...

随机推荐

  1. 使用canvas绘制饼状图

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  2. Linux: grep多个关键字“与”和“或”

    1.或操作 grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行 egrep '123|abc' filename // 用egrep ...

  3. Zabbix之Python发送邮件

    前言:继前篇zabbix邮件乱码问题解决,转码后,问题是解决了,但是又发现问题,有时候告警邮件没有邮件内容,只有标题,一直没找出原因,所以就换了Python脚本发送邮件,代码如下. 使用前当然是要先安 ...

  4. Logistic回归分析简介

    Logistic回归:实际上属于判别分析,因拥有很差的判别效率而不常用. 1. 应用范围: ①     适用于流行病学资料的危险因素分析 ②     实验室中药物的剂量-反应关系 ③     临床试验 ...

  5. Win7 IIS7 HTTP 错误 404.2 - Not Found解决方法 ISAPI CGI

    Win7 +IIS 刚配置的网站,输入网址后报以下错误: 应用程序“PFIZERQUERY”中的服务器错误 Internet Information Services 7.5 错误摘要 HTTP 错误 ...

  6. docker简易命令

    docker应用 安装 sudo yum install docker 启动 docker 进程 $ sudo service docker start Docker 默认开机启动 $ sudo ch ...

  7. [转]JSP页面的动态包含和静态包含示例及介绍

    原文地址:http://www.jb51.net/article/53659.htm 一.静态包含 本文介绍JSP静态包含语句,即使用JSP的include指令来完成的包含操作.JSP中,有两种包含其 ...

  8. 模式匹配之Boyer-Moore算法

    BM 算法是一个较优的模式匹配算法.一般,如果不考虑模式串的长度,一个具有时间复杂度O(n)的算法应该是最优的了,但是事实不是如此.BM算法可以实现更高效率的模式匹配.分析和实验说明,BM匹配算法对于 ...

  9. [转]css选择器优先级深入理解

    转载自:http://www.jb51.net/css/67029.html 一.基础选择器 css基础选择器有标签选择器.类选择器.id选择器.通用选择器 1.标签选择器 每个html页面都由很多个 ...

  10. c# 连等算式都在做什么

    在研究两个整数互换的方法时(详细看这里),发现了一个有趣的现象. a ^= b ^= a ^= b; ≠ a ^= b;b ^= a;a ^= b; 有兴趣的童鞋可以看看下面代码的结果是什么: int ...