首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重置ObjectFactory中的StructureMap

重置ObjectFactory中的StructureMap
EN

Stack Overflow用户
提问于 2009-08-13 20:56:53
回答 2查看 3.5K关注 0票数 1

我正在编写一些依赖于StructureMap的单元测试,所以我想在ObjectFactory方法中完全重置ObjectFactory。这就是我的SetUp方法现在看起来的样子:

代码语言:javascript
复制
[SetUp]
public void SetUp()
{
    ObjectFactory.Initialize(initializationExpression => {});
}

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

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

我使用的是2.5.3版本。

这里有一些人为的代码来说明我在说什么。我希望这次考试能通过,但事实并非如此。

代码语言:javascript
复制
[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;
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-14 16:58:00

我已经想明白了。实际上,ObjectFactory.EjectAllInstancesOf()依赖于T的配置。在我的代码中,我首先清除了所有配置,从而使ObjectFactory.EjectAllInstancesOf()的有效性失效。如果我切换这两行代码,它就能工作。

这样做是行不通的:

代码语言:javascript
复制
ObjectFactory.Initialize(initializationExpression => { });
ObjectFactory.EjectAllInstancesOf<ISomeInterface>();

这样做是可行的:

代码语言:javascript
复制
ObjectFactory.EjectAllInstancesOf<ISomeInterface>();
ObjectFactory.Initialize(initializationExpression => { });   
票数 1
EN

Stack Overflow用户

发布于 2009-08-13 21:21:04

不是一个确切的答案,而是让您考虑编写测试,使您不依赖于ObjectFactory,而是依赖于StructureMap容器?

代码语言:javascript
复制
var c = new StructureMap.Container(ce=>
       {
          ce.ForRequestedType<IFoo>().TheDefaultIsConcreteType<Bar>();
       });

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1274527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档