我正在使用StructureMap 2.6.4.0。我使用它的主要目标是简化我的测试。根据StructureMap文档(here),它对于临时模拟注入具有很好的功能(ObjectFactory.Inject <>())。ResetDefaults()方法在StructureMap中不起作用
纠正我,如果我错了,但这里是我该功能的理解:
- 您有映射到其接口的所有“真实”的实施有你的容器配置的代码在一个地方。
- 在每次测试运行之前,根据应用程序的相同代码初始化ObjectFactory。
- 如果任何测试需要使用“测试”来替换某个“真实”实现,那么它会在ObjectFactory上使用Inject方法注入“test”implpementation。
- 要恢复原始映射并删除注入模拟,您需要调用ResetDefaults()。
而我的问题是,在第4步。
这里是一个代码示例,该数字我的问题:
public interface IValueProvider
{
string GetValue();
}
public class ValueProvider : IValueProvider
{
public string GetValue()
{
return "Value provider";
}
}
public class TestValueProvider : IValueProvider
{
public string GetValue()
{
return "Test value provider";
}
}
class Program
{
static void Main(string[] args)
{
ObjectFactory.Initialize(x => x.For<IValueProvider>().Use<ValueProvider>());
var valueProvider = ObjectFactory.GetInstance<IValueProvider>();
Console.WriteLine(valueProvider.GetValue());
// I will see expected "Value provider"
ObjectFactory.Inject<IValueProvider>(new TestValueProvider());
valueProvider = ObjectFactory.GetInstance<IValueProvider>();
Console.WriteLine(valueProvider.GetValue());
// I will see expected "Test value provider"
ObjectFactory.ResetDefaults();
valueProvider = ObjectFactory.GetInstance<IValueProvider>();
Console.WriteLine(valueProvider.GetValue());
// I will see NOT expected "Test value provider".
// Doesn't ResetDefaults() have to restore a ValueProvider implementation?
}
}
所以,可能有人告诉我,我错了?或者它可能是StructureMap中的一个错误?