【转】Castle Windsor之组件注册
【转】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之组件注册相关推荐
- 依赖注入容器 Castle windsor的使用
2019独角兽企业重金招聘Python工程师标准>>> 在Castle中包含了一组开发框架,它里面的IOC容器是Windsor.在Windsor中提出了自动装配的概念,由容器来自动管 ...
- 组件命名方式||局部组件注册:局部组件只能在注册他的父组件中使用
组件命名方式 组件注册注意事项 如果使用驼峰式命名组件,那么在使用组件的时候,只能在字符串模板中用驼峰的方式使用组件,但是 在普通的标签 ...
- 组件化开发思想||全局组件注册语法||组件注册注意事项
组件化开发思想 编程中的组件化思想体现 组件化规范: Web Components 全局组件注册语法 <!DOCTYPE html> <html lang="en" ...
- COM+组件注册方法
有两种方式注册组件:一种是调用regsvr32.exe:例如我们运行regsvr32.exe c:\test.dll来注册位于C:盘根目录下的test.dll.另外一种是在MTS(微软事务服务器)中注 ...
- spring系列-注解驱动原理及源码-bean组件注册
目录 一.环境初始化 1.环境准备 二.bean的手动注入 1.xml方式注入bean 2.使用@Configuration&@Bean方式注入bean 三.自动扫描注册组件及bean 1.使 ...
- Vue.js入门教程-组件注册
一.组件创建 1.1 创建步骤 创建Vue的组件都有三个基本步骤是 [①创建组件构造器.②注册组件和③使用组件]. 1.2 基本示例 比如,我们创建一个Button组件. // 1. 创建一个组件构造 ...
- 解决IDL检索COM类工厂中CLSID为{ }组件注册失败
作者用的envi版本为5.3 在第一次利用C#对IDL进行二次开发出现组件注册失败 解决方法: 亲测有效 以管理员的身份运行命令提示符 然后在文本框内输入即可解决 C:\Windows\System3 ...
- 避免Castle Windsor引起的内存泄露
原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...
- (24)Vue.js组件—组件注册
一.Vue.js组件注册内容 • 全局注册 • 组件基础 • 局部注册 二.全局注册 • 全局注册的组件在注册后可以用于任意实例或组件中. <body><div id="a ...
最新文章
- 在Docker中运行Spring Boot的高级功能测试
- javascript 之反射
- STM32如何查找hardfault原因
- python创建矩阵行向量_python矩阵和向量的转置问题
- wxWidgets:wxAny类用法
- socket网络编程——多进程、多线程处理并发
- linux centos 7z压缩工具简单使用
- 存储服务器的操作系统,存储服务器是什么操作系统
- 随想录(systemtap中的基本原理)
- 研究:三分之一英国人或因机器人“丢饭碗”
- 这就是为什么IT人没有女朋友的原因!!
- 古今地名对照总表!(按笔划数排序,强烈推荐的资料)
- Android 沉浸式全面详解(这一篇文章就够了)
- quoted-printable解码程序
- 神经网络实现鸢尾花分类(Tensorflow2.0)
- 自动驾驶行业开源数据集调研
- 移动式护栏巡逻机器人_重磅!移动式护栏巡逻执法机器人上岗!专盯高速乱停乱行!...
- 《Dreamweaver CS6 完全自学教程》笔记 第十七章:Spry 框架技术
- C#—MDI(多文档界面)
- pythonweb数据可视化_独家 | 基于Python实现交互式数据可视化的工具(用于Web)
热门文章
- 【Transformer】HRFormer:High-Resolution Transformer for Dense Prediction
- 谈谈 Android 中的 PathClassLoader 和 DexClassLoader
- 恒大全国降价,最低74折,接下来会有其他楼盘跟进降价吗?
- 数据库设计笔记——MySQL基础知识(四)
- 北京80后整体亮相《北京作家》
- ads s参数拟合_ADS S参数仿真介绍
- java model 中文乱码,java传值乱码解决方法
- 单选按钮带文字_计算机二级MS office高级应用历年真题操作题文字解析
- oracle存储过程 ppt,oracle_存储过程培训(动画版本)详解.ppt
- 反向Z(Reversed-Z)的深度缓冲原理