使用Structuremap更改范围的多个构造函数?

Sté*_*ane 4 .net structuremap ioc-container object-lifetime

为了说明问题,这是我的设置的简化版本.我有一个像这样的工厂:

public interface IFactory{ }

public class Factory : IFactory
{
    public Factory()
    {
        Console.WriteLine("parameterless");
    }

    //public Factory(int i)
    //{
    //    Console.WriteLine("with parameter : {0}", i);
    //}

}
Run Code Online (Sandbox Code Playgroud)

测试它的程序是一个consoleApp.足以证明我的观点.

static void Main(string[] args)
{
     Init();
     var factory1 = ObjectFactory.GetInstance<IFactory>();
     var factory2 = ObjectFactory.GetInstance<IFactory>();
     var factory3 = ObjectFactory.GetInstance<IFactory>();
     Console.Read();
 }
Run Code Online (Sandbox Code Playgroud)

我在我的Init静态方法中设置了strucutreMap.

  public static void Init()
        {
            ObjectFactory.Initialize(x =>
            {
                 //insert Initialization code here.
            });
        }
Run Code Online (Sandbox Code Playgroud)

如果我只有一个构造函数并设置StructureMap,如下所示:

x.For<IFactory>().Use<Factory>();
Run Code Online (Sandbox Code Playgroud)

工作完美,输出显示无
参数无
参数无
参数

每次调用都会构建一个新实例.

现在,如果我取消注释第二个构造函数,但我想使用无参数构造函数,并使用相同的默认生活方式.我该怎么办?

我试过了:

x.SelectConstructor<IFactory>(() => new Factory());
x.For<IFactory>().Use<Factory>();
Run Code Online (Sandbox Code Playgroud)

它不起作用:缺少InstanceKey的请求实例属性"i"

如果我喜欢这样:

 x.For<IFactory>().Use(new Factory());
Run Code Online (Sandbox Code Playgroud)

它可以工作,但输出只是一个"无参数",这意味着它不会为每个调用构建一个新实例.它正在使用我传入的这个特定实例.

我发现的唯一方法是在我的无参数构造函数之上添加[DefaultConstructor]并使用标准的x.For().Use(); 但我不想添加此属性并在我的模型中传播配置.

救命?

Sté*_*ane 9

SelectConstructor采用具体类型,而不是接口.当然,接口没有任何构造函数.但没有什么打破,它只是被忽略了....所以我无法发现这个错误.

 x.SelectConstructor<IFactory>(() => new Factory());
 x.For<IFactory>().Use<Factory>();
Run Code Online (Sandbox Code Playgroud)

应该

 x.SelectConstructor<**Factory**>(() => new Factory());
 x.For<IFactory>().Use<Factory>();
Run Code Online (Sandbox Code Playgroud)