web-dev-qa-db-ja.com

StructureMapの使用時にコンストラクター引数を渡す

DIにStructureMapを使用しています。次のような1つの引数を取るクラスがあるとします。

public class ProductProvider : IProductProvider
{
     public ProductProvider(string connectionString)
     { 
         ....
     }
}

IProductProviderのインスタンスを取得するときに、「connectionString 実行時」を指定する必要があります。

StructureMapを次のように構成しました。

ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>().  
WithCtorArgument("connectionString");

ただし、実行時にこの値を動的に指定する機能が必要なため、ここではEqualTo( "something ...")メソッドを呼び出したくありません。

私の質問は、ObjectFactoryを使用してIProductProviderのインスタンスを取得するにはどうすればよいですか?

現在、私は次のようなものがあります:

ObjectFactory.GetInstance<IProductProvider>();  

しかし、ご存知のとおり、これは機能しません...

どんなアドバイスもいただければ幸いです。

42
Mosh

自分で答えを見つけました!これが解決策です:

ObjectFactory.With("connectionString").EqualTo(someValueAtRunTime).GetInstance<IProductProvider>();

これが同じ問題に遭遇した他の人に役立つことを願っています。

33
Mosh

それをStructureMap構成で宣言することをお勧めします。少し新しいStructureMapコードを使用します。

For<IProductProvider>().Use<ProductProvider>
  .Ctor<string>("connectionString").Is(someValueAtRunTime);

このようにして、クライアントコードに負担をかけずに値を知る必要がなくなり、IoC構成をメインコードから分離しておくことができます。

55

Structuremap 2.6.xを実行している場合は、次のことを行う必要があります。

For<IProductProvider>().Use<ProductProvider>().WithProperty("name").EqualTo(someValueAtRunTime);

プロパティ名がコンストラクタの引数と一致していることを確認してください。

パラメーターがアプリ設定からのものである場合は、次の行を使用します。

.WithProperty("").EqualToAppSetting("")
0
JWallace