9

2つのコンストラクタを持つクラスがあります。他のコンストラクタを使用するためのストラクチャのマップ

のMyClass()私はいつでも私は、その後のStructureMapを伝えるにはどうすればよい

のMyClass(IMyServiceサービス)

の新しいMyClassのを() 'は、実際に第二のコンストラクタを呼び出してはいけません最初のコンストラクタ。

助けてください。

答えて

20

new MyClass()を呼び出すと、StructureMapはまったく関与しません。構造マップの構成の量は、動作を変更しません。

ObjectFactory.GetInstance<MyClass>()を呼び出すと、StructureMapはデフォルトでより多くのパラメータでコンストラクタを呼び出します。

あなたはのStructureMapは異なるコンストラクタを使用したい場合、あなたは(PHeibergの答えを経由して)コンストラクタを指定することができます。

x.SelectConstructor<IMyClass>(() => new MyClass(null)); 

それとも、単にUse()ことのオーバーロードを使用してインスタンスを作成する方法を明示のStructureMapを伝えることができます受け入れるa Func<>

x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>())) 
+0

2つのパラメータを持つMyClassコンストラクタを使用する場合はどうすればよいですか? 'ctx.GetInstance <>'は1つの型パラメータしか許されません。 –

5

ジョシュアの答えはすべての側面をカバーしています。ジョシュアの例で行ったように、コンストラクタに引数をハードコーディングせずに、特定のコンストラクタを選択するのStructureMapを設定するために、サイドノートとして、あなたはSelectContructorメソッドを使用することができます。

x.SelectConstructor<MyService>(() => new MyService()); 

SelectConstructorメソッド呼び出しでラムダが呼び出す必要があります必要なコンストラクタ(存在するすべてのパラメータに対して、nullまたは適切な型の任意の値を設定します)。詳細については、the documentationを参照してください。

0

構造体マップのようなDIコンテナを使用する場合は、すべてのクラスにただ1つのコンストラクタを置くことをお勧めします。 IMyServiceが依存関係(少し奇妙に見えます)の場合、このコンストラクタはクラスのすべての依存関係を解決する必要があります。これは、パラメータ化されていないコンストラクタが必要ないようにインスタンス化するときに常に解決されるべきです。

+0

申し訳ありませんが、私は今修正しました。 CMyServiceの代わりに、私はユーザーCMyClassを持っています。ありがとう。 –

関連する問題