1. 程式人生 > >SPRING.NET 1.3.2 學習18--方法注入之IObjectFactoryAware,IObjectNameAware

SPRING.NET 1.3.2 學習18--方法注入之IObjectFactoryAware,IObjectNameAware

多數使用者都會將容器中的大部分物件佈署為singleton模式。當一個singleton物件需要和另一個singleton物件協作,或者一個非singleton物件需要和另一個非singleson物件協作時,Spring.NET都能很好的處理它們的依賴關係。但是,如果物件的生存週期不同,就可能會產生問題。例如,假設一個singleton物件A要使用一個非singleton(原型)物件B,A中的每個方法都會用到B的新例項。由於A是singleton物件,容器只有會建立它一次,也就是說只有一次給A的屬性賦值的機會,所以不可能在每次A需要的時候都給它注入一個新的B。

有一種解決的辦法有點違背控制反轉原則:類A可以通過實現IObjectFactoryAware
介面來獲取容器的引用,並呼叫GetObject("B")在每次需要的時候從容器中請求一個(新的)物件B。但這並不是一個很好的解決方案,因為客戶程式碼此時必須要和Spring.NET發生緊耦合。

通過方法注入,我們可以用更優雅的方式解決類似的問題。(摘自Spring.NET中文手冊)

Spring.Net 中提供了兩個介面,我們使用這兩個介面可以讓物件瞭解自己的容器。

一 . IObjectFactoryAware 介面

實現了 Spring.Objects.Factory.IObjectFactoryAware 介面 的物件可以在被容器建立後獲取它所在容器的引用。該介面只有一個(只寫的)屬性:

IObjectFactory ObjectFactory

:該屬性會在初始化方法(IInitializingObject 的 AfterPropertiesSet 方法,或在物件定義中由 init-method 屬性 指定的方法)完成後被賦值。

IObjectFactoryAware 介面 允許物件通過程式設計方式訪問建立它的容器,一般主要用來在程式設計時獲得容器內的其它物件。雖然這種方式在某些情況下(似乎)很有用,但我們應該儘量避免這麼做,因為這會導致程式碼同 Spring.NET 發生緊耦合,並且違反了控制反轉原則。

二 . IObjectNameAware 介面

Spring.Objects.Factory.IObjectNameAware 介面 可讓物件知道在容器中叫什麼名稱,如果物件需要知道自己在容器中的名稱,可以實現該介面:

string ObjectName:該屬性使實現了 IObjectNameAware 介面 的物件能夠知道自己在容器中的名稱。

此文章展示了它們的用法