2016-12-06 4 views
0

с StructureMap мы делаем:Самое элегантное решение для изменения контекста StructureMap

internal static class ContainerBootstrapper 
     { 
    public static void BootstrapStructureMap() 
     { 
     ObjectFactory.Initialize(x => 
     { 
      x.For<SafeFlowContext>().HttpContextScoped().Use<SafeFlowContext>(); 
      x.For<DbContext>().HttpContextScoped().Use<SafeFlowContext>(); 

      x.For<IInterface>().HttpContextScoped().Use<Class>(); 
      ... 

только один раз для каждого приложения, в соответствии с:

public sealed class ServiceLoc 
     { 
      public static ServiceLoc GetInstance() 
      { 
       return new ServiceLoc(); 
      } 

      private IInterfacesHere 

      private ServiceLocator() 
      { 
       if (!_isInitialized) 
       { 
        lock (_lockThis) 
        { 
         ContainerBootstrapper.BootstrapStructureMap(); 
         ... 

Я пишу юнит-тестов, и я знаю, может изменить область действия с HttpContextScoped на Hybrid, поскольку это является причиной моей проблемы.

Однако, будучи немного пуристом, я не хочу менять производственный код для целей тестирования, и я не хочу копировать блоки кода вставки (или целые файлы классов) для изменения области.

Я не возражаю, но потенциально изменяю сферу действия на основе условного (если это кратким).

До сих пор я думал о попытке подделать мои модульные тесты, чтобы пометить их как HttpContext и добавить переключатель bool в локатор службы, возможно, с аргументом по умолчанию, например, когда мой модульный тест вызывает его через:

_serviceLocator = ServiceLocator.GetInstance(bool httpcontext=false); 

Например, это просто не выглядит удовлетворительным. Я проверил сайт structuremap, но примеры, которые я видел, похоже, не соответствуют моей цели.

Cheers!

+0

Вы пробовали условные константы компиляции? –

+0

@AdrianStanculescu Нет сэр - не могли бы вы пояснить в этом случае, пожалуйста? – notsoobvious

ответ

0

Несмотря на то, что это связано с изменением производственного кода, я в итоге просто изменил метод определения области использования, чтобы использовать «HybridHttpOrThreadLocalScoped», поскольку он был явно выше.

Смежные вопросы