我正在使用 StructureMap 2.6.4.0。我使用它的主要目标是简化我的测试。根据 StructureMap 文档(此处),它有一个很棒的临时模拟注入功能(ObjectFactory.Inject<>())。
如果我错了,请纠正我,但这是我对该功能的理解:
- 您将容器配置代码放在一个地方,所有“真实”实现都映射到它们的接口。
- 在每次测试运行之前,您都根据与您的应用程序相同的代码来初始化您的 ObjectFactory。
- 如果任何测试需要用“测试”替换一些“真实”实现,它会使用 ObjectFactory 上的 Inject 方法注入“测试”实现。
- 要恢复原始映射并删除注入的模拟,您需要调用 ResetDefaults()。
我的问题在第四步。
这是一个代码示例,它说明了我的问题:
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 中的错误?