为了说明问题,这是我的设置的简化版本。 我有一个像这样的工厂:
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.
});
}
如果我只有一个构造函数并设置了StructureMap:
x.For<IFactory>().Use<Factory>();
效果很好,输出显示为
参
参
无参数
每次调用都会构建一个新实例。
现在,如果我取消注释第二个构造函数,但我想使用无参数构造函数,并使用相同的默认生活方式。我该怎么办?
我试过了:
x.SelectConstructor<IFactory>(() => new Factory());
x.For<IFactory>().Use<Factory>();
它不起作用:缺少InstanceKey的请求实例属性“i”
如果我喜欢这样:
x.For<IFactory>().Use(new Factory());
它有效,但输出只是一个“无参数”,这意味着它不会为每个调用构建一个新实例。它正在使用我传递的这个特定实例。
我找到的唯一方法是在我的无参数构造函数之上添加[DefaultConstructor]并使用标准x.For()。Use(); 但是我不想添加这个属性并在我的模型中传播配置。
帮助?
答案 0 :(得分:9)
SelectConstructor采用具体类型,而不是接口。当然,接口没有任何构造函数。 但没有什么打破,它只是被忽略了......所以我无法发现这个错误。
x.SelectConstructor<IFactory>(() => new Factory());
x.For<IFactory>().Use<Factory>();
应该是
x.SelectConstructor<**Factory**>(() => new Factory());
x.For<IFactory>().Use<Factory>();