2014-07-15 62 views
-1

我有一箇中央服務(在一個非常大的在線系統中),其中類註冊爲'foo',提供者。當系統需要獲取一些foos時,請致電所有註冊的提供商。我的問題是,使類註冊的自然地方是在一個靜態的構造函數中;但是隻有在調用該類的一部分時纔會調用靜態構造函數。強制靜態構造函數被稱爲

static Widdler() 
{ 
    FooManager.RegisterProvider(() => GetMyFoos()); 
} 

但這可能不會發生一段時間 - 類提供其他服務;他們可能會使用很多或一點點。

我可以強制這些靜態結構嗎?

任何人都可以想出更好的方法嗎? (這些不是動態加載的插件 - 在這種情況下作爲加載的一部分,我會檢查他們的IFooProvider等接口)。

編輯:好的 - 我無法控制何時調用構造函數。我應該用什麼來代替?我的中央服務並不直接瞭解這些提供商。所以調用一個'init'函數沒有打開。我正在想像一個事件公共汽車的酒吧子模型,但這是不一樣的。當用戶需要某些東西時,'訂閱者'需要給'發佈者'打電話(而不是在發生什麼事情時接到電話)

+0

在我看來,類不應該註冊自己,它應該是別人的工作來註冊它們。也許是「FooManager」。 – hatcyl

回答

0

通常,解決這個問題的方法是使用像Unity這樣的框架並取代你的RegisterProvider

你要做的是統一搜索所有在你通過「Registration by Convention」系統指定的程序集中實現IFooProvider的類,並自動加載它們。

然後在你需要實現IFooProvider的所有類的列表的代碼只需調用container.ResolveAll<IFooProvider>,它將返回所有類的IEnumerable<IFooProvider>它檢測實現接口。