3

私たちが取り組んでいるプロジェクトでは、Castle Windsor を IOC コンテナーとして使用しています。現時点では、柔軟性のために構成ファイルですべての依存関係を指定しています。

私たちの構成ファイルは少し大きいので、バインディングをより簡単に管理できるようにするために、それらをコードに入れることを好みます。もちろん、これは、本番環境で特定のバインディングを簡単に変更する柔軟性が少し失われることを意味します。

構成ファイルのバインディングでコードのバインディングを上書きできるかどうか疑問に思っていました。これは、コードですべての既定のバインディングを指定し、運用環境でバインディングを変更する場合に、いくつかの例外を除いて構成ファイルを追加できることを意味します。

ウィンザー城を使っているので、ウィンザー城でこんなことができるのか興味があります。ただし、別の IOC コンテナー (NInject など) への移行を検討しています。したがって、別の人がそのようなことをはるかにうまく行うことができる場合、私はその情報にも興味があります.

(PS: 私たちのインターフェースのほとんどは単体テストの目的であり、同じ名前から "I" を除いた名前でそれを実装するクラスが 1 つしかないため、自動バインディングも検討しています。これらのインターフェースを配置することも検討しています。実装と同じファイルです。)

前もって感謝します。

アップデート

私は、私が望む方法で自動バインディングを行うことができる素晴らしい Ninject 拡張機能を見つけました。また、XML バインディングを行うための Ninject 拡張機能も見つけました。ただし、これらの XML バインディングがコード バインディングで上書きされるかどうかはわかりません。

4

1 に答える 1

1

私はあなたがコード内のバインディングを求めていると思う柔軟性を達成しましたが、それはあなたが望むタイプのデザインではないかもしれません...

機能をモジュール (IModule インターフェイスを実装するクラスを 1 つだけ持つアセンブリ) に分割します。各アセンブリに IModule を実装すると、そのアセンブリのすべての実装クラスが DI コンテナーに登録されます。次に、アセンブリをスキャンしてそのアセンブリの IModule 実装を探し、適切なモジュール ロード メソッドを呼び出すモジュール ローダー クラスを作成します。このように、各アセンブリは自己完結型であり、実装を切り替えたいときに、必要なアセンブリを文字通りドロップできます。

この機能を使用すると、アセンブリをどのように分割して、実装をスワップ アウトするかを細かく決定できます。多くの柔軟性が必要な場合、これは非常にアセンブリが重いため、すべての人に適した戦略ではありません。

私の調査では、Windsor の開発者は、バインディングをオーバーライドすることは悪い習慣であると考えているため、オーバーライドする機能をほとんど提供していないことがわかりました。

于 2012-10-14T19:14:23.717 に答える