C# 在StructureMap中重置ObjectFactory

C# 在StructureMap中重置ObjectFactory,c#,structuremap,C#,Structuremap,我正在编写一些依赖StructureMap的单元测试,因此我想在[SetUp]方法中完全重置ObjectFactory。这就是我的[SetUp]方法现在的样子: [SetUp] public void SetUp() { ObjectFactory.Initialize(initializationExpression => {}); } 这似乎重置了配置,因为我可以执行ObjectFactory.WhatDoIHave()方法,并且它不包含我的任何配置。但是,对象的缓存实例不会

我正在编写一些依赖StructureMap的单元测试,因此我想在[SetUp]方法中完全重置ObjectFactory。这就是我的[SetUp]方法现在的样子:

[SetUp]
public void SetUp()
{
    ObjectFactory.Initialize(initializationExpression => {});
}
这似乎重置了配置,因为我可以执行ObjectFactory.WhatDoIHave()方法,并且它不包含我的任何配置。但是,对象的缓存实例不会被删除,而是在后续测试中返回。有没有办法完全重置ObjectFactory

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

我使用的是2.5.3版

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

[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;
        }
    }
}
[TestFixture]
公共类测试结构图
{
[测试]
使用cachedobjects()的public void firsttest
{
ObjectFactory.Configure(Configure=>
configure.ForRequestedType()
.默认混凝土类型()
.CacheBy(InstanceScope.ThreadLocal)
);
ISomeInterface firstSomeInterface=ObjectFactory.GetInstance();
AreEqual(1,firstSomeInterface.ID);
初始化(initializationExpression=>{});
ObjectFactory.EjectAllInstancesOf();
ObjectFactory.Configure(Configure=>
configure.ForRequestedType()
.默认混凝土类型()
.CacheBy(InstanceScope.ThreadLocal)
);
ISomeInterface secondSomeInterface=ObjectFactory.GetInstance();
AreEqual(2,secondSomeInterface.ID);
}
公共接口
{
int ID{get;}
}
公共类实现:ISomeInterface
{
创建的私有静态int numberofInstances;
私有只读int-id;
公共整数ID
{
获取{return id;}
}
公共实施()
{
id=++NumberOfInstancesCreated;
}
}
}

这不完全是一个答案,但您是否考虑过编写测试,以便不依赖ObjectFactory而依赖StructureMap容器

var c = new StructureMap.Container(ce=>
       {
          ce.ForRequestedType<IFoo>().TheDefaultIsConcreteType<Bar>();
       });
var c=newstructuremap.Container(ce=>
{
ce.ForRequestedType()。默认混凝土类型();
});

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

我已经找到了它。ObjectFactory.EjectAllInstancesOf()实际上取决于T的配置。在我的代码中,我首先清除了所有配置,从而取消了ObjectFactory.EjectAllInstancesOf()的有效性。如果我切换这两行代码,它就会工作

这不起作用:

ObjectFactory.Initialize(initializationExpression => { });
ObjectFactory.EjectAllInstancesOf<ISomeInterface>();
ObjectFactory.Initialize(initializationExpression=>{});
ObjectFactory.EjectAllInstancesOf();
这确实有效:

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

我修改了上面发布的测试,改为使用容器,但仍然失败。