2009-07-10 52 views
1

我有註冊碼以下位:Castle Windsor:有沒有辦法重寫組件ID?

Component.For<IPublishingService>().ImplementedBy<UseStoredProcedureToPrintService>(), 
Component.For<IConfirmationDialog<AutomatedTransaction>>().ImplementedBy<ShipmentConfirmationDialog>().Named("ShipmentConfirmationDialog"), 
Component.For<IConfirmationService<AutomatedTransaction>>().ImplementedBy<SingleTransactionConfirmation>().ServiceOverrides(
    ServiceOverride.ForKey("shipmentDialog").Eq("ShipmentConfirmationDialog")), 

一個要求下來,在某些情況下,應用程序應該表現有所不同的線路。偉大的我想,這正是我使用溫莎城堡開始。

所以我寫了我的新組件,我先註冊了它們。例如,我以不同的方式實現IPublishingService,並首先註冊新實現,以便通過上面的默認實現進行解析。然而,在少數情況下,我沒有選擇,只能使用ID來連接服務覆蓋。例如,我如何重定向ShipmentConfirmationDialog的ServiceOverride以使用我的新SpecialCaseShipmentConfirmationDialog實現而不修改上面的代碼位?

城堡windsor有各種各樣的機制,我不像轉發和ActAs我真正理解,我希望將提供一個簡單的答案。

回答

3

我會保持簡單。如果它是可配置的,將其放置在配置文件(web.config/app.config)中,然後僅使用ConfigurationManager.AppSettings["shipmentDialogToUse"];

加載ID。還要記住,流暢的註冊API不是註冊的全部和最終全部。 XML仍然有它的時間和地點,它是這個工作的正確工具。

+0

當您需要對已部署的應用程序進行更改時,我認爲它是正確的工具。否則,只需將所有註冊都註冊到註冊服務商類中,並添加一個簡單的動態發現機制,即可找到註冊服務商所有本地dll。 在我的情況下,我有一個應用程序,可以部署對2個非常不同的數據庫,所以我需要部署它與不同的模型翻譯層和幾個不同的UI屏幕。由於所有的配置都是部署時間,我不明白爲什麼xml配置是必要的(儘管我也允許)。 點雖然。仍然太糟糕了,沒有覆蓋機制。 – 2009-07-11 21:21:13

相關問題