在上文中的例子實現了spring.net 控制反轉的簡單例子:
但是不免其中會有一些疑問。
例子中的配置文件是什么意思:
app.config的配置規則可以參考web.config的配置詳情
<sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" /> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup>
加入spring環境支持,注冊了這個節點處理器后,配置文件中的<spring>節點才能起作用。
<context>節點的type屬性是可選的,在Windows應用中,其默認值就是Spring.Context.Support.xmlapplicationContext
那么在
上個例子中我是用了 :
<resource uri="file://objects.xml"></resource>來指定訪問文件的訪問吧objects.xml里的配置信息加入resource中這里的uri常用的還有兩種方式:assembly://程序集名/命名空名/文件名 加載嵌入的資源的xml文件config://spring/objects 直接使用app.config 中的配置 <objectsxmlns="http://www.springframework.net"/>里的配置信息:值得注意的是:xml配置中xmlns="http://www.springframework.net"是必須添加的:在上篇博客里中,容器的實例化:
IApplicationContext ctx = ContextRegistry.GetContext();//直接讀取配置文件重的配置信息。
實際物理路徑
IResource input = new FileSystemResource(@"D:/Objects.xml"); //實際物理路徑 IObjectFactory factory = new XmlObjectFactory(input);
程序集下尋求配置文件
string[] xmlFiles = new string[] { "file://Objects.xml" }; IApplicationContext context = new XmlApplicationContext(xmlFiles); IObjectFactory factory = (IObjectFactory)context; Console.ReadLine();在objects.xml中對對象定義:
其中:
對象標識符(id和name):
一個對象有一個或多個id,id在容器中應該是唯一的,一個對象通常只有一個標識符,如果指定了多個標識符,其余的被認為是別名。
在xml定義對象時,用id或者name屬性來定義對象的標識符。每個對象都需要用id或name屬性定義至少一個標識符。id屬性允許為對象定義指定一個唯一的id,因為在Spring.NET的shcema文檔中,id被標識為XML元素的ID屬性,XML解析器可以在其它元素引用它的時候進行驗證,在配置對象標識符時,應該優先使用id屬性。但是,id屬性值不能包含任何XML ID不允許使用的字符。如果一定要使用這些字符,應該使用name屬性,在name屬性中也可以通過逗號或分號為對象指定一個或多個別名。
Singleton和Prototype:
對象可以通過兩種模式布署:singleton和非singleton(或者叫做prototype,只是用在這里不是很合適)。當一個對象被定義為singleton時,容器中就只會有一個共享的實例,任何時候通過id或別名請求該對象都會返回這個共享實例的引用(也就是說這個對象只會被創建一次)。
當使用非singleton,或者說原型模式布署時,每次請求對象都會創建新的實例。在某些場合,如果需要為每個用戶返回單獨的用戶對象或其它對象,非singlton布署模式就比較理想。
如果沒有顯式指定,對象的布署模式默認為singleton。注意非singleton(原型)模式會使Spring.NET在每次請求對象時都創建新的實例,這也許并非是我們預期的行為。所以,除非絕對需要,否則不要使用原型模式。
property
對對象的屬性實力還,可以直接指定name="屬性名" value="屬性值"或者 ref="實例化的為另一個對象的id"
注意:在為泛型類對象指定type屬性的時候要注意:第一,左尖括號<要替換成字符串“<”,因為在XML中左尖括號會被認為是小于號。從可讀性來講,我們都知道這并不是理想的方式。第二,type參數值中不能包含程序集的名稱,因為程序集名稱要求和類型全名用逗號隔開,而在這里逗號已經被用來分隔泛型類的類型參數了。將來可能會用其它字符代替這兩個符號,但目前還沒找到更具可讀性的方案。若要提高可讀性,建議使用類型別名,如下所示:
<typeAliases> <alias name="GenericDictionary" type=" System.Collections.Generic.Dictionary<,>" /> <alias name="myDictionary" type="System.Collections.Generic.Dictionary<int,string>" /></typeAliases>
然后,下面的對象定義:
<object id="myGenericObject" type="GenericsPlay.ExampleGenericObject<System.Collections.Generic.Dictionary<int , string>>, GenericsPlay" />
就可以縮短為:
<object id="myOtherGenericObject" type="GenericsPlay.ExampleGenericObject<GenericDictionary<int , string>>, GenericsPlay" />
或者更短:
<object id="myOtherOtherGenericObject" type="GenericsPlay.ExampleGenericObject<MyIntStringDictionary>, GenericsPlay" />
使用Spring.NET框架經常用到的一下幾個文件:
Common.Logging.dll(必要)Spring.Core.dll(必要)Spring.Data.dllSpring.Aop.dll(可選)Spring.Data.NHibernate21.dllSpring.Web.dll
新聞熱點
疑難解答