StructureMap: как заменить объект во время выполнения
Я пытаюсь внедрить смоделированный экземпляр ISession (NHibernate) в структуру карты. В настоящее время все это подключается в методе Bootstrap, но я хочу заменить тот, который вводится, поддельным. Я пытался EjectAllInstancesOf, но он выбрасывает исключение.
[TestFixtureSetUp]
public void TestFixtureSetup()
{
Bootstrapper.Bootstrap();
//TODO: need to remove already wired up types that we are mocking.
var mockSession = MockRepository.GenerateStub<ISession>();
var mockLoggerFactory = MockRepository.GenerateStub<ILoggerFactory>();
ObjectFactory.EjectAllInstancesOf<ISession>();
ObjectFactory.EjectAllInstancesOf<ILoggerFactory>();
ObjectFactory.Inject<ISession>(mockSession);
ObjectFactory.Inject<ILoggerFactory>(mockLoggerFactory);
}
Ошибка:
System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. в StructureMap.Pipeline.HttpContextLifecycle.findHttpDictionary() в c:\dev\opensource\structuremap\Source\StructureMap\Pipeline\HttpContextLifecycle.cs: строка 50 в StructureMap.Pipeline.HttpContextLifecycle.FindCache() в c: \ dev \ opensource \ Structuremap \ Source \ StructureMap \ Pipeline \ HttpContextLifecycle.cs: строка 28 в StructureMap.Pipeline.HttpContextLifecycle.EjectAll() в c:\dev\opensource\structuremap\Source\StructureMap\Pipeline\HttpContextLifecycle.cs: строка 23 в StructureMap.Pipeline.HttpLifecycleBase`2.EjectAll() в c:\dev\opensource\structuremap\Source\StructureMap\Pipeline\HttpLifecycleBase.cs: строка 18 в StructureMap.InstanceFactory.EjectAllInstances() в c:\dev\opensource\structuremap\Source\StructureMap\InstanceFactory.cs: строка 127 в StructureMap.PipelineGraph.EjectAllInstancesOf() в c:\dev\opensource\structuremap\Source\StructureMap\PipelineGraph.cs: строка 193 в StructureMap.Container.EjectAllInstancesOf() в c: \ dev \ с открытым исходным кодом \ StructureMap\Source\StructureMap\Container.cs: строка 393 в StructureMap.ObjectFactory.EjectAllInstancesOf() в c:\dev\opensource\structuremap\Source\StructureMap\ObjectFactory.cs: строка 277
2 ответа
Вы получаете это исключение, потому что ваш тип плагина (ISession) настроен в StructureMap как жизненный цикл HttpContext, а HttpContext отсутствует в модульном тесте. Это, вероятно, ошибка в StructureMap, она должна генерировать свое собственное исключение, объясняющее проблему, вместо того, чтобы использовать исключение NullReferenceException.
во всяком случае, в настройках модульного теста (Boostrapper) измените жизненный цикл ISession на Hybrid или что-то еще, кроме HttpContext.
Избавиться от звонков EjectAllInstancesOf()
, призвание Inject()
должен делать то, что вы хотите.