Castle IOC容器构建配置详解(一)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
摘要:知道如何简单使用Castle IOC,也听完了Castle IOC的内幕故事,从本文开始讲会详细讲解Castle IOC的一些使用。先从构建配置信息开始吧,在Castle IOC中并不像Spring.net那样贯穿着一个思想就是一切皆为配置,对于对象之间的依赖关系,Castle IOC会自动去连接,因此相比之下它的配置文件要比Spring.net简单的多。

 

主要内容

1 .配置什么

2 .几种配置方式

3 Include 介绍

4 Properties介绍

5 .条件状态

 

一.配置什么

Castle IOC 中并不像Spring.net那样贯穿着一个思想就是一切皆为配置,对于对象之间的依赖关系,Castle IOC会自动去连接,因此相比之下它的配置文件要比Spring.net简单的多。我们主要配置的就是ComponentFacility,所有的组件配置都放在Components节点中,每一个组件以<Component>开始,以</Component>结束,其中组件ID必须指定,组件的参数用<   parameters > 节点来指定:

None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< components >
None.gif
None.gif        
< component  id ="comp1" >
None.gif
None.gif            
< parameters >
None.gif
None.gif                
< para > component1 para </ para >
None.gif
None.gif            
</ parameters >
None.gif
None.gif        
</ component >
None.gif
None.gif        
< component  id ="comp2" >
None.gif
None.gif            
< parameters >
None.gif
None.gif                
< para > component2 para </ para >
None.gif
None.gif            
</ parameters >
None.gif
None.gif        
</ component >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >
所有的扩展单元配置都在 Facilities节点中,每一个扩展单元以一个 <Facility>开始,以 </Facility>结束:
None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< facilities >
None.gif
None.gif        
< facility  id ="nhibernate"  type ="Full Type Name, AssemblyName" ></ facility >
None.gif
None.gif        
< facility  id ="transaction"  type ="Full Type Name, AssemblyName" ></ facility >
None.gif
None.gif    
</ facilities >
None.gif
None.gif
</ configuration >
二.几种配置方式

Castle IOC中,支持三种方式的配置

l          XML 方式的配置

l          应用程序配置文件

l          实现接口IconfigurationStore自定义配置

1 XML方式的配置

指定一个自定义的XML作为配置文件,在实例化容器的时候用 XmlInterpreter ,简单的配置文件如下

None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< components >
None.gif
None.gif        
< component  id ="txtLog" >
None.gif
None.gif            
< parameters >
None.gif
None.gif                
< target > log.txt </ target >
None.gif
None.gif            
</ parameters >
None.gif
None.gif        
</ component >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >
初始化容器时的代码

None.gif IWindsorContainer container  =   new  WindsorContainer(  new  XmlInterpreter( " BasicUsage.xml " ) );
2 .使用应用程序配置文件

Web.config或者App.config作为配置文件,这种方式的配置在实例化时不需要指定配置文件,容器会自动去检查应用程序的配置文件中的Castle IOC配置区

None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< configSections >
None.gif
None.gif        
< section  name ="castle"  type ="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler,Castle.Windsor"   />
None.gif
None.gif    
</ configSections >
None.gif
None.gif    
< castle >
None.gif
None.gif        
< components >
None.gif
None.gif            
< component  id ="txtLog" >
None.gif
None.gif                
< parameters >
None.gif
None.gif                    
< target > log.txt </ target >
None.gif
None.gif                
</ parameters >
None.gif
None.gif            
</ component >
None.gif
None.gif        
</ components >
None.gif
None.gif    
</ castle >
None.gif
None.gif
</ configuration >
初始化容器时直接采用默认初始化

None.gif IWindsorContainer container  =   new  WindsorContainer( new  XmlInterpreter() );
  三.Include介绍

有时系统比较复杂,组件会非常的多。如果把这么多的组件放在了同一个配置文件里面去配置,配置文件将变得很大,而且不易阅读。使用Include可以把配置文件分开在很多个不同的配置文件中,最后统一在一个XML中或者应用程序配置文件指定这些分开配置文件的URI。如下面所示,我们有这样三个配置文件:

properties.config

None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif  
< properties >
None.gif
None.gif    
< StrConn > MyConnectionString </ StrConn >
None.gif
None.gif  
</ properties >
None.gif
None.gif
< properties >
None.gif
None.gif    
< TimeOut > 500 </ TimeOut >
None.gif
None.gif  
</ properties >
None.gif
None.gif
</ configuration >
facilities.config

None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< facilities >
None.gif
None.gif        
< facility  id ="nhibernate"  type ="Full Type Name, AssemblyName" ></ facility >
None.gif
None.gif    
</ facilities >
None.gif
None.gif
</ configuration >
services.config

None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif  
< components >
None.gif
None.gif    
< component  id ="ILog"  
None.gif
None.gif      type
="CastleDemo.DatabaseLog, CastleDemo"   />
None.gif
None.gif  
</ components >
None.gif
None.gif
</ configuration >
则在 Web.config或者 App.config中就可以这样去写了:

None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< configSections >
None.gif
None.gif        
< section  name ="castle"  type ="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"   />
None.gif
None.gif    
</ configSections >
None.gif
None.gif    
< castle >
None.gif
None.gif        
< include  uri ="file://properties.config"   />
None.gif
None.gif        
< include  uri ="file://facilities.config"   />
None.gif
None.gif        
< include  uri ="file://services.config"   />
None.gif
None.gif    
</ castle >
None.gif
None.gif
</ configuration >
 四.Properties介绍

 
配置文件中,经常我们会遇到一个相同的值在多个地方使用,如数据库连接中的字符串,我们要是在每一个用到的地方都配置一遍,如果服务器变了,那所有的这些地方都得改动,这时可以使用Properties节点来配置,在容器使用配置信息之前,它将会被配置文件中的另一个Properties来替换,需要替换的地方我们使用#{}来标识。如
None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< properties >
None.gif
None.gif        
< connectionString > server=local;uid=sa;pwd=sa;database=test </ connectionString >
None.gif
None.gif    
</ properties >
None.gif
None.gif    
< components >
None.gif
None.gif        
< component  id ="connectionfactory"  service ="Company.Project.IConnectionFactory, Company.Project"
None.gif
None.gif            type
="Company.Project.DefaultConnectionFactory, Company.Project" >
None.gif
None.gif            
< properties >
None.gif
None.gif                
< connString > #{connectionString} </ connString >
None.gif
None.gif            
</ properties >
None.gif
None.gif        
</ component >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >
五.条件状态

配置文件有时候会非常的复杂,Castle IOC支持我们在配置文件中使用条件选择或者判断,这有点像C#预处理指令(如#if,如果你没有使用过,可以参考MSDN),可以使用以下的节点:

名称

示例

define

< define   flag ="DEBUG"   />

undef

< undef   flag ="DEBUG"   />

if

< if   defined ="DEBUG">

    <interceptors>

        <interceptor>${logging.interceptor}</interceptor>

    </interceptors>

</ if >

choose

< choose >

    <when defined="DEBUG">

        <component id="BasicUsageDebug" />

    </when>

     ……

</ choose >

when

choose结合使用

otherwise

choose结合使用

一个完整的配置示例如下:
None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< define  flag ="DEBUG"   />
None.gif
None.gif    
< components >
None.gif
None.gif        
< component  id ="BasicUsageDemo" >
None.gif
None.gif            
< if  defined ="DEBUG" >
None.gif
None.gif                
< interceptors >
None.gif
None.gif                    
< interceptor > ${logging.interceptor} </ interceptor >
None.gif
None.gif                
</ interceptors >
None.gif
None.gif            
</ if >
None.gif
None.gif        
</ component >
None.gif
None.gif        
< undef  flag ="DEBUG"   />
None.gif
None.gif        
< choose >
None.gif
None.gif            
< when  defined ="DEBUG" >
None.gif
None.gif                
< component  id ="BasicUsageDebug"   />
None.gif
None.gif            
</ when >
None.gif
None.gif            
< when  defined ="Complex" >
None.gif
None.gif                
< component  id ="ComplexDeme"   />
None.gif
None.gif            
</ when >
None.gif
None.gif            
< when  defined ="Prod" >
None.gif
None.gif                
< component  id ="ProdDemo"   />
None.gif
None.gif            
</ when >
None.gif
None.gif            
< otherwise >
None.gif
None.gif                
< component  id ="Default"   />
None.gif
None.gif            
</ otherwise >
None.gif
None.gif        
</ choose >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >

Castle IOC
容器的基本配置就到这儿了,在下一篇中会介绍一些复杂类型的配置及类型转换。

 

参考资料

Castle 的官方网站[url]http://www.castleproject.org[/url]

















本文转自lihuijun51CTO博客,原文链接:  http://blog.51cto.com/terrylee/67676 ,如需转载请自行联系原作者
相关文章
|
26天前
|
运维 安全 Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在数字化转型的浪潮中,企业对于IT基础设施的要求越来越高,不仅需要快速响应市场变化,还要确保系统的稳定与安全。本文深入探讨了如何通过融合DevOps文化和容器化技术来构建一个高效、稳定且易于管理的云基础设施。通过实际案例分析,阐述了持续集成/持续部署(CI/CD)流程的优化、自动化测试、监控以及日志管理等关键环节的实施策略,旨在为运维专业人员提供一套切实可行的解决方案。
23 3
|
29天前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
Java 测试技术 开发工具
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
|
29天前
|
运维 Kubernetes Devops
构建高效可靠的云基础设施:DevOps与容器化技术融合实践
【2月更文挑战第30天】 在当今快速迭代和竞争激烈的软件开发领域,传统的IT运维模式已难以满足业务发展的需要。本文将探讨如何通过整合DevOps文化和容器化技术,构建一个既高效又可靠的云基础设施。文章首先回顾了DevOps的核心理念及其对运维工作流的影响,接着深入讨论了容器化技术的优势和挑战,并提出了一套结合两者的实施方案。最后,通过案例分析展示了该方案在实际环境中的应用效果和潜在益处。
|
1天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
7 0
|
4天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
6天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第13天】 在当今快速迭代和持续部署的软件开发环境中,传统的IT运维模式已难以满足业务发展的需求。本文聚焦于如何通过融合DevOps理念与容器化技术,构建一个高效、稳定且易于管理的云基础设施。文章将探讨持续集成/持续交付(CI/CD)流程的优化、容器化技术的最佳实践、以及微服务架构下的应用管理,以期为企业提供一种改进运维效率、加速产品上市时间,同时保障系统稳定性的解决方案。
|
22天前
|
运维 Kubernetes 监控
构建高效稳定的容器化运维环境
在现代IT基础设施中,容器技术以其轻量级、快速部署和易于管理的特性成为企业数字化转型的重要支撑。本文将深入探讨如何构建一个高效且稳定的容器化运维环境,涵盖从容器选择、集群管理到持续集成与持续部署(CI/CD)的最佳实践。文章旨在为运维工程师提供一套系统的解决方案,以应对日益复杂的业务需求和技术挑战。
|
22天前
|
运维 监控 云计算
构建高效稳定的Docker容器监控体系
随着微服务架构的普及,Docker容器作为其核心承载单元,在系统运维中扮演着日益重要的角色。本文旨在探讨如何构建一个高效且稳定的Docker容器监控体系,以确保容器运行的可靠性和系统的高可用性。文章首先分析了容器监控的必要性,接着详细介绍了监控体系的设计理念和组件选择,最后提供了实施过程中的关键步骤与最佳实践。通过本文,读者将掌握构建和维护Docker容器监控体系的有效方法。
|
24天前
|
运维 Kubernetes 监控
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在当今云计算时代,企业追求敏捷性、可扩展性以及成本效益的云基础设施。本文将探讨如何通过DevOps文化与容器化技术的融合,打造一个既高效又稳定的运维环境。文章不仅阐述了DevOps和容器化技术各自的优势,还提供了一个具体的实施案例,展示了这种结合如何优化资源利用、提高部署速度并降低运维复杂性。