我喜歡用於依賴注入的構造函數注入。它強制從一種類型明確聲明關注,並有助於可測性。構造注入替代方案(Castle Windsor)
我喜歡構造函數注入,在最地方...
記錄,那是我不喜歡它的一個例子。如果我有許多其他類繼承的基類,並且我希望所有這些類都使用我的ILogger(或其他)的實例,並且我不想要一個靜態工廠(Logger.Instance)... I不想在每個需要ILogger的子類上聲明一個構造函數。
所以,我可以有我的基類申報記錄作爲財產並將它注入這樣
public class MyBaseClass
{
public ILogger Logger { get; set; }
}
...但
- 這並不向我保證記錄儀實際上被注入並且不爲空。
- 我不喜歡與公共集
所以......我有什麼其他選擇ILogger? (我正在使用溫莎城堡)。
我考慮做一個接口
public interface IInitializable<T>
{
void Initialize(T instance);
}
public class MyBaseClass : IInitializable<ILogger>, ...could have other IInitializables too...
{
protected ILogger Logger { get; private set; }
public void Initialize(ILogger instance)
{
Logger = instance;
}
}
然後有我的容器上的設施,自動呼籲建築類型IInitializable<T>
所有實現...
但我不知道還有什麼其他人民'的想法是在我走那條路線之前......
爲什麼你不想使用靜態工廠模式? – 2010-12-09 19:03:48
Ctor注入等,對於不同的測試等實現是非常有用的,但是你是否真的需要這種測試呢?您是否真的需要能夠在實例級別更改日誌記錄實施?靜態工廠模式仍然會使您能夠改變通常所需的* overall * logging實現。 – 2010-12-09 19:10:41
記錄器返回的實現需要是動態的。具體來說Logger.Instance應該根據上下文而不同(即WCF操作,WPF客戶端,SL客戶端等)。我想我可以在.Current內部做一個服務定位器,但是這是一種反模式,據我所知... – Jeff 2010-12-09 19:42:35