gpt4 book ai didi

c# - ResetDefaults() 方法在 StructureMap 中不起作用

转载 作者:行者123 更新时间:2023-11-28 20:44:19 28 4
gpt4 key购买 nike

我正在使用 StructureMap 2.6.4.0。我使用它的主要目的是简化我的测试。根据 StructureMap 文档 (here),它有一个很棒的临时模拟注入(inject)功能 (ObjectFactory.Inject<>())。

如果我错了请纠正我,但这是我对该功能的理解:

  1. 您将容器配置代码放在一个地方,并将所有“真实”实现映射到它们的接口(interface)。
  2. 在每次测试运行之前,您都会根据与您的应用程序相同的代码初始化您的 ObjectFactory。
  3. 如果任何测试需要用“测试”实现替换某些“真实”实现,它会使用 ObjectFactory 上的 Inject 方法注入(inject)“测试”实现。
  4. 要恢复原始映射并删除注入(inject)的模拟,您需要调用 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 中的错误?

最佳答案

ResetDefaults()方法切换 profileString.Empty .在你的情况下它已经是。这不会删除通过 Inject<T>(T object) 注册的插件类型.

Inject<T>(T object)方法将对象注册为 PluginType“T”的默认值。换句话说,它会覆盖您当前的默认值,即具体类型 ValueProvider .

StructureMap 的文档已过时,所以我猜测它在早期版本中的工作方式与文档中描述的方式相同,但现在已不再如此。

所以使用 Inject<T>(T object)仅当您想在运行时覆盖已配置插件类型的默认值或使用 StructureMap 配置文件时才使用该方法。

StructureMap 确实提供了一些从容器中删除“弹出”类型的方法。其中之一是:

ObjectFactory.Model.EjectAndRemoveTypes(match =>            
match != null &&
match == typeof (TestValueProvider)
);

此代码确实删除了 Inject<T>(T object) 所做的注册方法但不恢复类型的默认实例 IValueProvider .这意味着 IValueProvider 不再有默认实例.

为此ObjectFactory.GetInstance<IValueProvider>()会抛出 StructureMap Exception Code: 202
No Default Instance defined for PluginFamily ...
异常(exception)。

ObjectFactory.GetAllInstances<IValueProvider>().First()会给你返回 ValueProvider 的实例.你期待的那个。

我不太确定您在这里要测试什么,但是如果它们是单元测试,您应该尽量避免需要 IoC 容器(这也意味着取决于 ObjectFactory )。如果您确实需要容器,请使用 IContainer 的抽象您可以自己管理和创建。支持这一点的其他 SO 问题的一些链接是:

关于c# - ResetDefaults() 方法在 StructureMap 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19741605/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com