Чтобы проиллюстрировать проблему, вот упрощенная версия моей установки.
У меня есть такой завод:
public interface IFactory{ }
public class Factory : IFactory
{
public Factory()
{
Console.WriteLine("parameterless");
}
//public Factory(int i)
//{
// Console.WriteLine("with parameter : {0}", i);
//}
}
Программа для проверки это консоль приложения. Достаточно, чтобы доказать мою точку зрения.
static void Main(string[] args)
{
Init();
var factory1 = ObjectFactory.GetInstance<IFactory>();
var factory2 = ObjectFactory.GetInstance<IFactory>();
var factory3 = ObjectFactory.GetInstance<IFactory>();
Console.Read();
}
Я установил strucutreMap в моем статическом методе Init.
public static void Init()
{
ObjectFactory.Initialize(x =>
{
//insert Initialization code here.
});
}
Если у меня есть только один конструктор и настройка StructureMap, как это:
x.For<IFactory>().Use<Factory>();
, который отлично работает, и вывод показывает
* 1014 без параметров *
* 1015 без параметров *
без параметров
Каждый вызов создает новый экземпляр.
Теперь, если я раскомментирую второй конструктор, но я хочу использовать без параметров и с тем же стилем жизни по умолчанию. Как бы я сделал?
Я пробовал это:
x.SelectConstructor<IFactory>(() => new Factory());
x.For<IFactory>().Use<Factory>();
Это просто не работает: отсутствует запрашиваемое свойство экземпляра "i" для InstanceKey
Если я так и сделаю:
x.For<IFactory>().Use(new Factory());
Это работает, но вывод только один «без параметров» означает, что он не создает новый экземпляр для каждого вызова. Он использует этот конкретный экземпляр, который я передаю.
Единственный способ, который я нашел, это добавить [DefaultConstructor] поверх моего конструктора без параметров и использовать стандартную x.For (). Use ();
Но я не хочу добавлять этот атрибут и распространять конфигурацию по моей модели.
Помощь