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

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();
 }

我设置strucutreMap在我的初始化静态方法。

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

如果我只有一个构造和设置StructureMap这样的:

x.For<IFactory>().Use<Factory>();

这可以完美,并且输出显示结果 参结果 参结果 参

每个呼叫生成一个新实例。

现在,如果我去掉第二个构造函数,但我想用一个无参数,并用相同的默认的生活方式。我会怎么做?

我尝试的是:

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

这是行不通的:缺少请求实例属性的“i”为InstanceKey

如果我这样做:

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

它的工作原理,但输出仅仅是一个“参”,也就是说它不是建立一个新的实例每次调用。它使用这个特定的实例我通过在

我发现的唯一的方法是添加在我的参数构造的顶部的[预设构造函数],使用标准x.For()使用(); 但我不希望添加这个属性和传播配置翻过我的模型。

帮助?

有帮助吗?

解决方案

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

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

 x.SelectConstructor<**Factory**>(() => new Factory());
 x.For<IFactory>().Use<Factory>();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top