StructureMap:如何在运行时替换对象

时间:2010-06-29 16:44:44

标签: structuremap

我正在尝试将模拟的ISession(NHibernate)实例注入到结构图中。目前它都在Bootstrap方法中连接它,但是我想替换用模拟注入的方法。我尝试过EjectAllInstancesOf,但它会抛出execption。

 [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()in   C:\ dev的\开源\ structuremap \源\ StructureMap \管道\ HttpContextLifecycle.cs:   StructureMap.Pipeline.HttpContextLifecycle.FindCache()中的第50行   C:\ dev的\开源\ structuremap \源\ StructureMap \管道\ HttpContextLifecycle.cs:   在StructureMap.Pipeline.HttpContextLifecycle.EjectAll()中的第28行   C:\ dev的\开源\ structuremap \源\ StructureMap \管道\ HttpContextLifecycle.cs:   在StructureMap.Pipeline.HttpLifecycleBase`2.EjectAll()中的第23行   C:\ dev的\开源\ structuremap \源\ StructureMap \管道\ HttpLifecycleBase.cs:   在StructureMap.InstanceFactory.EjectAllInstances()中的第18行   C:\ dev的\开源\ structuremap \来源\ StructureMap \ InstanceFactory.cs:   在StructureMap.PipelineGraph.EjectAllInstancesOf()中的第127行   C:\ dev的\开源\ structuremap \来源\ StructureMap \ PipelineGraph.cs:   StructureMap.Container.EjectAllInstancesOf()中的第193行   c:\ dev \ opensource \ structuremap \ Source \ StructureMap \ Container.cs:line   393在StructureMap.ObjectFactory.EjectAllInstancesOf()中   C:\ dev的\开源\ structuremap \来源\ StructureMap \ ObjectFactory.cs:   第277行

2 个答案:

答案 0 :(得分:2)

您收到此异常是因为您的插件类型(ISession)在StructureMap中设置为HttpContext生命周期,并且单元测试中没有HttpContext。这可能是StructureMap中的一个错误,它应该抛出它自己的异常来解释问题而不是命中NullReferenceException。

无论如何,在您的单元测试设置(Boostrapper)中,将ISession的生命周期更改为Hybrid或HttpContext之外的其他内容。

答案 1 :(得分:0)

取消对EjectAllInstancesOf()的调用。致电Inject()应该做你想做的事。