主要內容
1.配置什麼
2.幾種配置方式
3.Include 介紹
4.Properties介紹
5.條件狀態
一.配置什麼
Castle IOC中並不像Spring.net那樣貫穿著一個思想就是一切皆為配置,對 於對象之間的依賴關系,Castle IOC會自動去連接,因此相比之下它的配置文件 要比Spring.net簡單的多。我們主要配置的就是Component和Facility,所有的 組件配置都放在Components節點中,每一個組件以<Component>開始,以 </Component>結束,其中組件ID必須指定,組件的參數用< parameters >節點來指定:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<components>
<component id="comp1">
<parameters>
<para>component1 para</para>
</parameters>
</component>
<component id="comp2">
<parameters>
<para>component2 para</para>
</parameters>
</component>
</components>
</configuration>
所有的擴展單元配置都在Facilities節點中,每一個擴展單元以一個 <Facility>開始,以</Facility>結束:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<facilities>
<facility id="nhibernate" type="Full Type Name, AssemblyName"></facility>
<facility id="transaction" type="Full Type Name, AssemblyName"></facility>
</facilities>
</configuration>
二.幾種配置方式
在Castle IOC中,支持三種方式的配置
l XML方式的配置
l 應用程序配置文件
l 實現接口IconfigurationStore自定義配置
1.XML方式的配置
指定一個自定義的XML作為配置文件,在實例化容器的時候用XmlInterpreter ,簡單的配置文件如下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<components>
<component id="txtLog">
<parameters>
<target>log.txt</target>
</parameters>
</component>
</components>
</configuration>
初始化容器時的代碼
IWindsorContainer container = new WindsorContainer( new XmlInterpreter("BasicUsage.xml ") );
2.使用應用程序配置文件
用Web.config或者App.config作為配置文件,這種方式的配置在實例化時不 需要指定配置文件,容器會自動去檢查應用程序的配置文件中的Castle IOC配置 區
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler ,Castle.Windsor" />
</configSections>
<castle>
<components>
<component id="txtLog">
<parameters>
<target>log.txt</target>
</parameters>
</component>
</components>
</castle>
</configuration>
初始化容器時直接采用默認初始化
IWindsorContainer container = new WindsorContainer(new XmlInterpreter() );
三.Include介紹
有時系統比較復雜,組件會非常的多。如果把這麼多的組件放在了同一個配 置文件裡面去配置,配置文件將變得很大,而且不易閱讀。使用Include可以把 配置文件分開在很多個不同的配置文件中,最後統一在一個XML中或者應用程序 配置文件指定這些分開配置文件的URI。如下面所示,我們有這樣三個配置文件 :
properties.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<properties>
<StrConn>MyConnectionString</StrConn>
</properties>
<properties>
<TimeOut>500</TimeOut>
</properties>
</configuration>
facilities.config
<?xml version="1.0" encoding="utf-8" ?>
services.config
<configuration>
<facilities>
<facility id="nhibernate" type="Full Type Name, AssemblyName"></facility>
</facilities>
</configuration>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<components>
<component id="ILog"
type="CastleDemo.DatabaseLog, CastleDemo" />
</components>
</configuration>
則在Web.config或者App.config中就可以這樣去寫了:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler , Castle.Windsor" />
</configSections>
<castle>
<include uri="" />
<include uri="" />
<include uri="" />
</castle>
</configuration>
四.Properties介紹
配置文件中,經常我們會遇到一個相同的值在多個地方使用,如數據庫連接 中的字符串,我們要是在每一個用到的地方都配置一遍,如果服務器變了,那所 有的這些地方都得改動,這時可以使用Properties節點來配置,在容器使用配置 信息之前,它將會被配置文件中的另一個Properties來替換,需要替換的地方我 們使用#{}來標識。如
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<properties>
<connectionString>server=local ;uid=sa;pwd=sa;database=test</connectionString>
</properties>
<components>
<component id="connectionfactory" service="Company.Project.IConnectionFactory, Company.Project"
type="Company.Project.DefaultConnectionFactory, Company.Project">
<properties>
<connString>#{connectionString} </connString>
</properties>
</component>
</components>
</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結合使用
一個完整的配置示例如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<define flag="DEBUG" />
<components>
<component id="BasicUsageDemo">
<if defined="DEBUG">
<interceptors>
<interceptor>${logging.interceptor} </interceptor>
</interceptors>
</if>
</component>
<undef flag="DEBUG" />
<choose>
<when defined="DEBUG">
<component id="BasicUsageDebug" />
</when>
<when defined="Complex">
<component id="ComplexDeme" />
</when>
<when defined="Prod">
<component id="ProdDemo" />
</when>
<otherwise>
<component id="Default" />
</otherwise>
</choose>
</components>
</configuration>
Castle IOC容器的基本配置就到這兒了,在下一篇中會介紹一些復雜類型的 配置及類型轉換。