StructureMap, настроить с помощью контейнера или objectfactory? - PullRequest
6 голосов
/ 15 сентября 2011

Я сделал свою конфигурацию так:

var container = new Container(x =>
                                              {
                                                  x.For<IEngine>().Use<V6Engine>();
                                                  x.For<ICar>().Use<HondaCar>();
                                              }
);

Тогда в моем действии контроллера mvc я сделал:

ICar car = ObjectFactory.GetInstance<ICar>();

Должен ли я каким-то образом настраивать свой контейнер с помощью Container или ObjectFactory? Это не помогло, поэтому я проверил что-то в консольном приложении c #, и это сработало, если я это сделал:

ICar car = container.GetInstance<ICar>();

Но это работает только в том случае, если контейнер находится в локальной области видимости, а в веб-приложении это явно не так, поскольку все в глобальном масштабе .asax.cs

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

ObjectFactory - это статический шлюз для экземпляра контейнера. Если вам нужен только один экземпляр контейнера, и вам нужен простой статический способ получить его, используйте ObjectFactory. Вы должны инициализировать ObjectFactory, а затем получить свои экземпляры через ObjectFactory.

В качестве альтернативы, если вы хотите сами управлять временем жизни контейнера, вы можете создать экземпляр контейнера, передав выражение инициализации в конструктор. Затем вы извлекаете экземпляры из объявленной вами переменной для хранения Контейнера.

В вашем примере вы смешиваете два подхода, которые не работают.

0 голосов
/ 15 сентября 2011

У меня настроен мой, как показано ниже

global.asax

  ObjectFactory.Initialize(action =>
            {
                action.For<ISomething>().Use<Something>;
            });

Тогда и везде.

 ObjectFactory.GetInstance<ISomething>();

Это не можетбыть единственным способом, хотя.Кроме того, я думаю, что вы можете искать это

Scan(scanner =>
        {
            scanner.AssemblyContainingType(....);
            scanner.AddAllTypesOf(....);
        }
...