【转】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来规定多个实现类的默认获取过来的类。

转载于:https://www.cnblogs.com/xdot/p/7338680.html

【转】Castle Windsor之组件注册相关推荐

  1. 依赖注入容器 Castle windsor的使用

    2019独角兽企业重金招聘Python工程师标准>>> 在Castle中包含了一组开发框架,它里面的IOC容器是Windsor.在Windsor中提出了自动装配的概念,由容器来自动管 ...

  2. 组件命名方式||局部组件注册:局部组件只能在注册他的父组件中使用

    组件命名方式 组件注册注意事项                 如果使用驼峰式命名组件,那么在使用组件的时候,只能在字符串模板中用驼峰的方式使用组件,但是                 在普通的标签 ...

  3. 组件化开发思想||全局组件注册语法||组件注册注意事项

    组件化开发思想 编程中的组件化思想体现 组件化规范: Web Components 全局组件注册语法 <!DOCTYPE html> <html lang="en" ...

  4. COM+组件注册方法

    有两种方式注册组件:一种是调用regsvr32.exe:例如我们运行regsvr32.exe c:\test.dll来注册位于C:盘根目录下的test.dll.另外一种是在MTS(微软事务服务器)中注 ...

  5. spring系列-注解驱动原理及源码-bean组件注册

    目录 一.环境初始化 1.环境准备 二.bean的手动注入 1.xml方式注入bean 2.使用@Configuration&@Bean方式注入bean 三.自动扫描注册组件及bean 1.使 ...

  6. Vue.js入门教程-组件注册

    一.组件创建 1.1 创建步骤 创建Vue的组件都有三个基本步骤是 [①创建组件构造器.②注册组件和③使用组件]. 1.2 基本示例 比如,我们创建一个Button组件. // 1. 创建一个组件构造 ...

  7. 解决IDL检索COM类工厂中CLSID为{ }组件注册失败

    作者用的envi版本为5.3 在第一次利用C#对IDL进行二次开发出现组件注册失败 解决方法: 亲测有效 以管理员的身份运行命令提示符 然后在文本框内输入即可解决 C:\Windows\System3 ...

  8. 避免Castle Windsor引起的内存泄露

    原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...

  9. (24)Vue.js组件—组件注册

    一.Vue.js组件注册内容 • 全局注册 • 组件基础 • 局部注册 二.全局注册 • 全局注册的组件在注册后可以用于任意实例或组件中. <body><div id="a ...

最新文章

  1. 在Docker中运行Spring Boot的高级功能测试
  2. javascript 之反射
  3. STM32如何查找hardfault原因
  4. python创建矩阵行向量_python矩阵和向量的转置问题
  5. wxWidgets:wxAny类用法
  6. socket网络编程——多进程、多线程处理并发
  7. linux centos 7z压缩工具简单使用
  8. 存储服务器的操作系统,存储服务器是什么操作系统
  9. 随想录(systemtap中的基本原理)
  10. 研究:三分之一英国人或因机器人“丢饭碗”
  11. 这就是为什么IT人没有女朋友的原因!!
  12. 古今地名对照总表!(按笔划数排序,强烈推荐的资料)
  13. Android 沉浸式全面详解(这一篇文章就够了)
  14. quoted-printable解码程序
  15. 神经网络实现鸢尾花分类(Tensorflow2.0)
  16. 自动驾驶行业开源数据集调研
  17. 移动式护栏巡逻机器人_重磅!移动式护栏巡逻执法机器人上岗!专盯高速乱停乱行!...
  18. 《Dreamweaver CS6 完全自学教程》笔记 第十七章:Spry 框架技术
  19. C#—MDI(多文档界面)
  20. pythonweb数据可视化_独家 | 基于Python实现交互式数据可视化的工具(用于Web)

热门文章

  1. 【Transformer】HRFormer:High-Resolution Transformer for Dense Prediction
  2. 谈谈 Android 中的 PathClassLoader 和 DexClassLoader
  3. 恒大全国降价,最低74折,接下来会有其他楼盘跟进降价吗?
  4. 数据库设计笔记——MySQL基础知识(四)
  5. 北京80后整体亮相《北京作家》
  6. ads s参数拟合_ADS S参数仿真介绍
  7. java model 中文乱码,java传值乱码解决方法
  8. 单选按钮带文字_计算机二级MS office高级应用历年真题操作题文字解析
  9. oracle存储过程 ppt,oracle_存储过程培训(动画版本)详解.ppt
  10. 反向Z(Reversed-Z)的深度缓冲原理