代码之家  ›  专栏  ›  技术社区  ›  Stefan Moser

在结构映射中重置ObjectFactory

  •  1
  • Stefan Moser  · 技术社区  · 15 年前

    我正在编写一些依赖于structuremap的单元测试,因此我希望在[setup]方法中完全重置objectforory。这就是我的[设置]方法现在的样子:

    [SetUp]
    public void SetUp()
    {
        ObjectFactory.Initialize(initializationExpression => {});
    }
    

    这似乎重置了配置,因为我可以执行objectfactory.whatdoihave()方法,它不包含我的任何配置。但是,对象的缓存实例不会被删除,并在随后的测试中返回。有办法去吗 完全地 重置对象工厂?

    我想我可能必须使用ObjectFactory.ejectAllInstanceSof(),但这似乎没有帮助。

    这里有一些人为的代码来显示我在说什么。我希望这次考试能通过,但没有。

    [TestFixture]
    public class TestingStructureMap
    {
        [Test]
        public void FirstTestUsingCachedObjects()
        {
            ObjectFactory.Configure(configure =>
                configure.ForRequestedType<ISomeInterface>()
                    .TheDefaultIsConcreteType<SomeImplementation>()
                    .CacheBy(InstanceScope.ThreadLocal)
                );
    
            ISomeInterface firstSomeInterface = ObjectFactory.GetInstance<ISomeInterface>();
            Assert.AreEqual(1, firstSomeInterface.ID);
    
            ObjectFactory.Initialize(initializationExpression => { });
            ObjectFactory.EjectAllInstancesOf<ISomeInterface>();
    
            ObjectFactory.Configure(configure =>
                configure.ForRequestedType<ISomeInterface>()
                    .TheDefaultIsConcreteType<SomeImplementation>()
                    .CacheBy(InstanceScope.ThreadLocal)
                );
    
            ISomeInterface secondSomeInterface = ObjectFactory.GetInstance<ISomeInterface>();
            Assert.AreEqual(2, secondSomeInterface.ID);
        }
    
        public interface ISomeInterface
        {
            int ID { get; }
        }
    
        public class SomeImplementation : ISomeInterface
        {
            private static int NumberOfInstancesCreated;
            private readonly int id;
    
            public int ID
            {
                get { return id; }
            }
    
            public SomeImplementation()
            {
                id = ++NumberOfInstancesCreated;
            }
        }
    }
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   flq    15 年前

    不完全是一个答案,但您是否考虑过编写测试以使您不依赖于ObjectFactory而是结构映射容器?

    var c = new StructureMap.Container(ce=>
           {
              ce.ForRequestedType<IFoo>().TheDefaultIsConcreteType<Bar>();
           });
    

    在这种情况下,您可以简单地重新创建容器和我的猜测是,它应该是在原始状态。

        2
  •  1
  •   Steve Ellinger    10 年前

    我已经弄明白了。objectfactory.ejectAllInstanceSof()实际上取决于T的配置。在我的代码中,我首先清除了所有配置,从而使objectfactory.ejectAllInstanceSof()的有效性无效。如果我切换这两行代码,它就会工作。

    这不起作用:

    ObjectFactory.Initialize(initializationExpression => { });
    ObjectFactory.EjectAllInstancesOf<ISomeInterface>();
    

    这是可行的:

    ObjectFactory.EjectAllInstancesOf<ISomeInterface>();
    ObjectFactory.Initialize(initializationExpression => { });