問題を説明するために、ここに私のセットアップの簡易版を示します。私はこのような工場を持っています:
public interface IFactory{ }
public class Factory : IFactory
{
public Factory()
{
Console.WriteLine("parameterless");
}
//public Factory(int i)
//{
// Console.WriteLine("with parameter : {0}", i);
//}
}
これをテストするプログラムは consoleApp です。私の主張を証明するには十分です。
static void Main(string[] args)
{
Init();
var factory1 = ObjectFactory.GetInstance<IFactory>();
var factory2 = ObjectFactory.GetInstance<IFactory>();
var factory3 = ObjectFactory.GetInstance<IFactory>();
Console.Read();
}
Init 静的メソッドで strucutreMap をセットアップします。
public static void Init()
{
ObjectFactory.Initialize(x =>
{
//insert Initialization code here.
});
}
コンストラクターが 1 つしかなく、StructureMap を次のようにセットアップする場合:
x.For<IFactory>().Use<Factory>();
それは完璧に機能し、出力は
パラメーター
なしパラメーターなし
パラメーターなし を示します
呼び出しごとに新しいインスタンスが構築されます。
ここで、2 番目のコンストラクターのコメントを外しますが、パラメーターのないコンストラクターを同じデフォルトのライフスタイルで使用したいとします。どうすればいいですか?
私はそれを試しました:
x.SelectConstructor<IFactory>(() => new Factory());
x.For<IFactory>().Use<Factory>();
機能しません: InstanceKey の要求されたインスタンス プロパティ "i" がありません
私がこれが好きなら:
x.For<IFactory>().Use(new Factory());
機能しますが、出力は「パラメーターなし」の 1 つにすぎません。つまり、呼び出しごとに新しいインスタンスを構築していません。私が渡すこの特定のインスタンスを使用しています。
私が見つけた唯一の方法は、パラメーターなしのコンストラクターの上に [DefaultConstructor] を追加し、標準の x.For().Use(); を使用することです。しかし、この属性を追加して、構成をモデル全体に広げたくありません。
ヘルプ?