Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简易喷油器,can';t覆盖现有注册_C#_Simple Injector - Fatal编程技术网

C# 简易喷油器,can';t覆盖现有注册

C# 简易喷油器,can';t覆盖现有注册,c#,simple-injector,C#,Simple Injector,我目前第一次使用简易注射器。在我的.NET项目中,我运行测试和模拟从web服务返回的数据,并将对象注册到容器中,如下所示 _container.Register<IWebServiceOrder>(() => mock.Object, Lifestyle.Transient); 不幸的是,即使使用上面的代码,当我第二次尝试注册对象时仍然会出现错误 在第一次调用GetInstance、GetAllInstances和Verify之后,无法更改容器 您知道为什么会发生这种情况吗

我目前第一次使用简易注射器。在我的.NET项目中,我运行测试和模拟从web服务返回的数据,并将对象注册到容器中,如下所示

 _container.Register<IWebServiceOrder>(() => mock.Object, Lifestyle.Transient);
不幸的是,即使使用上面的代码,当我第二次尝试注册对象时仍然会出现错误

在第一次调用GetInstance、GetAllInstances和Verify之后,无法更改容器


您知道为什么会发生这种情况吗?

在您已经使用容器之后替换现有注册几乎没有您期望的行为(这适用于所有DI库),这就是简单注入器容器被锁定的原因。更详细地描述了这一点(正如@qujck已经指出的)

首先,如果您正在编写单元测试,那么根本不应该使用容器。单元测试应该自己创建被测试的类,或者将此逻辑提取到一个方便的工厂方法中,例如:

专用静态邮件通知程序CreateMailNotifier(
IDeposit deposit=null,ISendMail mailSender=null,ILog logger=null)
{
返回新邮件通知程序(
押金??替换为(),
mailSender??替换为(),
记录器??替换为());
}
这种工厂方法是对传统方法的一种改进

通过使用可选参数,它允许单元测试仅指定测试期间所需的伪实现:

public void Notify_WithValidUser_LogsAMessage()
{
    // Arrange
    var user = new User();

    var logger = new FakeLogger();

    MailNotifier sut = CreateMailNotifier(logger: logger);

    // Act
    sut.Notify(user);

    // Assert
    Assert.AreEqual(expected: 1, actual: logger.LoggedMessages.Count);
}
如果您使用容器,因为手工创建被测类太麻烦,这表明被测类中存在问题(很可能是违反了单一责任原则)。防止使用工具解决设计中的问题您的代码正在与您对话。


然而,对于集成测试来说,使用容器更为常见,但是在这种情况下,您应该为每个集成测试创建一个新的容器。通过这种方式,您可以添加或替换
IWebServiceOrder
,而不会出现任何问题。

查看第一次调用解决方法后容器被锁定的原因。回答得很好。单元测试-不,不应该使用DI容器,但是集成测试-是,完全同意。我正在家里玩EF6、Simple Injector和SpecFlow,这很好用——我想在集成测试中替换一些东西——主要是使用DateTime——我有一个获取当前DateTime的服务。在工作中,我们确实有一个Unity注册的单元测试,它更像是一个冒烟测试,因为它允许使用InjectionConstructor进行无效/不完整的注册,但这会提前发现所有问题。注意:我们使用的Unity版本没有验证。@Andrez在Unity的烟雾测试中,你会发现所有的问题。只要看看简单的注入器在验证过程中执行的代码,告诉我你是否可以用Unity预先检测到这些类型的错误。
public void Notify_WithValidUser_LogsAMessage()
{
    // Arrange
    var user = new User();

    var logger = new FakeLogger();

    MailNotifier sut = CreateMailNotifier(logger: logger);

    // Act
    sut.Notify(user);

    // Assert
    Assert.AreEqual(expected: 1, actual: logger.LoggedMessages.Count);
}