2011-06-09 17 views
0

私は私の場合のStructureMapには、IoCコンテナによって返されるアプリケーションの一部のためのファサードを定義すると思っています。ファサードにはデフォルトの実装を設定する引数のないコンストラクタがあり、別のものはファサードが管理するさまざまなサブシステムオブジェクトのカスタム実装を定義することができます。のStructureMapとファサード

のStructureMapは、ほとんどの引数を持つコンストラクタを呼び出すファサードのインスタンスを作成しようとしているので、他のサブシステムのない実装が登録されていない場合は、それが失敗します。

私の質問は:それはメインのいずれかを使用できない場合の行に次のコンストラクタを使用しようとするのStructureMapを伝える方法はありますか?または、どのコンストラクタを選択するかをStructureMapに指示する必要がありますか?私の知る限り

+0

たぶん、サンプルコードのビットは、いくつかの可視化を支援します。 – IAbstract

+0

可能であれば、常に引数を持つコンストラクタが1つあります。型を初期化するデフォルトのコンストラクタを作成しないでください。このようにして、あなたの型は依然として具体的な依存関係と密接に結びついています。 StructureMapにその仕事をさせてください。 – Steven

+0

引数を持つ単一のコンストラクタを持つことは、まだ一握りですが、この場合はファサードを持つという目的をほとんど破ります。少しのサンプルを追加することについては、本当に必要かどうかわかりませんが、結局、私の質問には多くのコードは必要ありません。複数のコンストラクタを持つクラスを持つ場合、StructureMapは引数が大きい場合は最初のものを選択しますが、例外の場合には他のコンストラクタを何らかの形で使用することができますか? – Neverbirth

答えて

1

はそれはのStructureMap、インスタンスを解決しようと持っているとgreediestで成功でない場合は、代替ctorsにフォールバックすることはできません。

は、私は同様のStructureMapを使用して、ファサードのdependendenciesを配線し、そこにデフォルトを指定することをお勧めだろうと思います。おそらく、欠落しているサブシステムのデフォルトとしてNullオブジェクトの実装を使用することは可能です。

+0

私はそれも考えましたが、私はStructureMapが私に尋ねたことをすることができるかどうかを知りたいと思います。私はそれが素晴らしい追加だろうと思いますよね?私はこのケースでは、コンストラクタセレクタを使用することを好むが、 – Neverbirth

1

次のようにあなたのタイプを作成するデリゲートを指定することができます。

container.Configure(r => r.For<IFacade>().Use(() => new RealFacade())); 
+1

良い点は、私のソリューションよりも優れている(その理由馴染み感がある) – thekip

+0

ええ、私は、また、それを承知しています。とにかく私の個人的な味が、私は彼らに利点や不利な点があるかどうかわからないので、おそらくこの他のオプションは、おそらくこの他のスレッドの主題になる可能性があります。 – Neverbirth

+0

@Neverbirth:コンストラクタを直接呼び出すと、使用するDIコンテナによっては不利な点があります。 * Simple Injector *は、(RegisterInitializerメソッドを使用して)その型でポスト初期化を行いません。一方、* StructureMap *は(OnCreationForAllメソッドを使用して)行います。私が知る限り、Unity *にはそのような機能はありません。いずれにしても、コンストラクタに依存関係を追加するときは、DI構成を変更する必要があります。それは明らかな欠点です。 – Steven

関連する問題