Как настроить StructureMap для разрешения зависимостей в службе Windows? - PullRequest
3 голосов
/ 27 октября 2011

У меня есть веб, который был построен с использованием ASP.NET MVC 1.0. Он использует Structuremap в качестве контейнера IOC. Часть IOC хорошо работает, если я зарегистрирую ее в Application_Start следующим образом:

ObjectFactory.Initialize(service =>
    {
        service.ForRequestedType<IOrderRepository>()
               .TheDefaultIsConcreteType<OrderRepository>()
               .CacheBy(InstanceScope.PerRequest);
    });

Я должен использовать один и тот же бэкэнд в службе Windows.

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

Моя первая идея - зарегистрировать его в конструкторе сервиса следующим образом:

public Service1()
{
    ObjectFactory.Initialize(service =>
        {
            service.ForRequestedType<IOrderRepository>()
                   .TheDefaultIsConcreteType<OrderRepository>()
                   .CacheBy(InstanceScope.PerRequest);
        });
}

Это правильное место и правильный параметр для кэширования?

Читая документацию Structuremap , я думаю, что самый безопасный способ - использовать настройку по умолчанию для кэширования:

PerRequest - Операция по умолчанию. Новый экземпляр будет создан для каждого запроса.

У меня сложилось впечатление, что PerRequest означает HttpContext , но это еще одна запись:

HttpContext - Для каждого HttpContext будет создан отдельный экземпляр. Кэширует экземпляры в коллекции HttpContext.Items.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

За эту статью: http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.aspx

Исполняемый файл вызывает конструктор производного класса ServiceBase При первом звонке на услугу Старт . Обработка команд OnStart Метод вызывается сразу после выполнения конструктора. конструктор не выполняется снова после первого загружен, поэтому необходимо отделить выполненную обработку конструктором из того, что выполняется OnStart. Любые ресурсы, которые может быть выпущен OnStop должен быть создан в OnStart. Создание ресурсы в конструкторе препятствуют их правильному созданию если служба запускается снова после того, как OnStop выпустил ресурсы.

Похоже, что конструктор - это первый способ настройки структуры карты.

1 голос
/ 09 ноября 2011

Честно говоря, это в большей степени вклад "моих двух центов", который на самом деле пытается дать однозначный ответ, так как прошло много времени с тех пор, как я разработал Службу Windows, но это так.

Проведение аналогии с приложением ASP .Net MVC, в котором конфигурация контейнера выполняется в методе Application_Start класса Global.asax, а затем внедряется настроенный контейнер в пользовательскую фабрику контроллеров; Я полагаю, что вы могли бы вместо того, чтобы конфигурировать все в конструкторе службы, попытаться сделать это в функции Main исполняемого файла, поскольку он будет выполняться только один раз, а затем внедрить настроенный контейнер в конструктор службы.

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

Как я уже говорил, это было давно, и я никогда не делал этого с контейнером IoC или DI в этом отношении. Удачи!

...