4

問題を説明するために、ここに私のセットアップの簡易版を示します。私はこのような工場を持っています:

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(); を使用することです。しかし、この属性を追加して、構成をモデル全体に​​広げたくありません。

ヘルプ?

4

1 に答える 1

9

SelectConstructorは、インターフェースではなく、具象型を取ります。もちろん、インターフェースにはコンストラクターはありません。しかし、何も壊れません、それはただ無視されます....それで私はそのエラーを見つけることができませんでした。

 x.SelectConstructor<IFactory>(() => new Factory());
 x.For<IFactory>().Use<Factory>();

する必要があります

 x.SelectConstructor<**Factory**>(() => new Factory());
 x.For<IFactory>().Use<Factory>();
于 2010-02-24T14:12:21.233 に答える