Многократный конструктор с Structuremap, изменяющий область? - PullRequest
4 голосов
/ 24 февраля 2010

Чтобы проиллюстрировать проблему, вот упрощенная версия моей установки. У меня есть такой завод:

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 (); Но я не хочу добавлять этот атрибут и распространять конфигурацию по моей модели.

Помощь

1 Ответ

9 голосов
/ 24 февраля 2010

SelectConstructor принимает конкретный тип, а не интерфейс.Конечно, интерфейс не имеет конструктора.Но ничего не ломается, это просто игнорируется .... так что я не смог определить эту ошибку.

...