Удаление типа экземпляра по умолчанию из StructureMap во время выполнения - PullRequest
0 голосов
/ 10 января 2011

Можно ли удалить отображение во время выполнения? Я могу добавить один достаточно легко с помощью:

ObjectFactory.Configure(ce => 
       ce.ForRequestedType<IDateAdjuster>().
           TheDefaultIsConcreteType<DateAdjusterForTest>());

и я могу проверить, существует ли сопоставление с

ObjectFactory.Model.HasDefaultImplementationFor<IDateAdjuster>()

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

var config = ObjectFactory.Model.PluginTypes
           .FirstOrDefault(pt => pt.PluginType == typeof(IDateAdjuster));
if (config != null) {config.Default = null;}

Но это не работает.

Интерфейс скрывает свойства DateTime.Now и DateTime.Today, так что во время тестирования, в частности интеграции и принятия пользователем, система может быть настроена на смещение текущей даты и времени так, как она ее видит.

То, что я пытался сделать, это проверить, была ли реализация интерфейса по умолчанию, если бы тогда я создавал и вызывал ее, если нет, то просто использовал бы DateTime.Now и DateTime.Today


Кажется, что я не могу сказать структуре карты удалить тип по умолчанию, поэтому я добавил новую реализацию интерфейса по умолчанию и расширил интерфейс, чтобы иметь свойство, указывающее, активен ли он. Реализация по умолчанию указывает, что интерфейс не активен. Так что теперь я всегда могу получить экземпляр, а затем проверить, хочу ли я его использовать.

Система имеет довольно мало поведения, характерного для даты и времени, поэтому клиент должен иметь возможность протестировать поведение системы в разные даты и время. Они входят в раздел администратора и затем устанавливают дату и время в соответствующие значения, а затем я переключаю реализацию по умолчанию на реализацию теста, которая вносит соответствующие изменения.

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

Ответы [ 2 ]

2 голосов
/ 10 января 2011

Изменение конфигурации IoC во время выполнения немного страшно IMO.Возможно использование фабрики было бы более чистым решением.Например:

public interface IOptionalFactory
{
    IOptional GetInstance(IPrinciple currentUser);
}

Вы можете ввести IOptionalFactory вместо IOptional интерфейса и позволить фабрике возвращать различные экземпляры на основе предоставленной пользовательской информации.

1 голос
/ 10 января 2011

Так что, если коммутатор управляется чем-то, что изменяет пользователь, я предполагаю, что это в базе данных или, возможно, в сеансе? В этом случае вы можете использовать функцию условного конструирования StructureMap для этого:

var container = new Container(x =>
{         
  x.InstanceOf<IDateAdjuster>().Is.Conditional(o =>
  {                 
    o.If(c => c.GetInstance<IUserSettings>()
     .UseTestDateAdjuster).ThenIt.Is.OfConcreteType<DateAdjusterForTest>();

    o.TheDefault.Is.OfConcreteType<DateAdjuster>();
  });
});

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

Смотрите этот блог для более подробной информации: http://codebetter.com/jeremymiller/2009/01/19/conditional-object-construction-in-structuremap-i-e-fun-with-lambdas/

...