Castle Windsor 学习-----Installer的几种安装方式
来源:互联网 发布:百度地图 api 知乎 编辑:程序博客网 时间:2024/05/19 11:17
翻译
当使用依赖注入容器时,你首先要向容器中注册你的组件,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>
- Castle Windsor 学习-----Installer的几种安装方式
- Castle Windsor 学习-----Installer的几种安装方式
- Castle Windsor 学习-----Installer的几种安装方式
- Castle Windsor 学习-----Installer的几种安装方式
- Castle Windsor 学习-----Installer的几种安装方式
- Castle Windsor 学习-----Installer的几种安装方式
- Castle Windsor
- Castle学习笔记之Windsor(一)
- Castle学习笔记之Windsor(二)
- Castle学习笔记之Windsor(一)
- Castle学习笔记之Windsor(二)
- Castle学习系列(十一)---Windsor性能检测
- castle windsor IOC
- Castle Windsor之入门
- IOC-Castle Windsor映射
- Castle windsor快速入门
- Castle Windsor 文档
- Castle学习系列(九)---Windsor框架快速入门
- 首次接触Struts2框架(二)
- EntityFramework初学(增删改查)
- json和jsonp
- gcc do_overlap
- C++之Map
- Castle Windsor 学习-----Installer的几种安装方式
- 工欲善其事必先利其器-前端实习简历篇
- Mysql异常:MySQLNonTransientConnectionException: No operations allowed after statement closed
- 每天一个 Linux 命令(49):at命令
- FFMPEG结构体分析:AVPacket
- 数据结构组数相关
- 内存四区
- postgres sql 备份还原
- Linux下安装配置Redis2.8