2009-07-10 13 views
1

私は登録コードの以下のビットを持っている:城ウィンザー:コンポーネント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")), 

要件は、いくつかの例では、アプリケーションが多少異なる動作をすることになっている行を降りてきました。素晴らしいと思いましたが、これはまさに私がCastle Windsorを使い始めたことです。

私は新しいコンポーネントを書いて、まずそれらを登録します。例えば、私はIPublishingServiceを別々に実装し、新しい実装を最初に登録して、上記のデフォルトのものよりも解決するようにします。しかし、問題が発生したのは、IDを使用してサービスオーバーライドを行うという選択肢がない場合がほとんどです。たとえば、ShipmentConfirmationDialogのServiceOverrideを、上記のコードを変更せずに新しいSpecialCaseShipmentConfirmationDialog実装を使用するようにリダイレクトするにはどうすればよいですか?

城ウィンザーには私が実際に理解できないようなメカニズムがありますが、フォアサウンやActAsのような単純な答えが得られることを期待しています。

答えて

3

私はそれを簡単にしています。構成可能な場合は、config(web.config/app.config)に入れて、IDをロードしてください。ConfigurationManager.AppSettings["shipmentDialogToUse"];

また、流暢な登録APIは完全ではなく、すべての登録ではありません。 XMLにはまだ時間と場所があり、仕事のための適切なツールです。

+0

デプロイされたアプリを変更する必要があるときには、その仕事に適したツールだと思います。それ以外の場合は、すべての登録をRegistrarクラスに入れ、レジストラですべてのローカルdllを検出する単純な動的検出メカニズムを追加します。 私の場合、2つの非常に異なるデータベースに対して展開できるアプリがあるので、異なるモデル変換レイヤーといくつかの異なるUIスクリーンで展開する必要があります。すべての設定がデプロイメントタイムであるので、XML設定がなぜ必要なのかは本当にわかりません(私はそれも許可します)。 ポイントは受け取りました。まだあまりにも悪いのは、オーバーライドメカニズムがないことです。 –

関連する問題