Dependency injection StructureMap存根注入

Dependency injection StructureMap存根注入,dependency-injection,ioc-container,structuremap,stub,Dependency Injection,Ioc Container,Structuremap,Stub,我正在使用StructureMap并尝试为接口(存根)注册一个临时实现 阅读后,我想到了以下设置: 接口的定义: public interface IConsoleWriter { void Write(string message); } 定期执行: public class ConsoleWriter : IConsoleWriter { public void Write(string message) { Console.WriteLine("T

我正在使用StructureMap并尝试为接口(存根)注册一个临时实现

阅读后,我想到了以下设置:

接口的定义:

public interface IConsoleWriter
{
    void Write(string message);
}
定期执行:

public class ConsoleWriter : IConsoleWriter
{
    public void Write(string message)
    {
        Console.WriteLine("That's the message: '{0}'", message);
    }
}
public class FakeConsoleWriter : IConsoleWriter
{
    public void Write(string message)
    {
        Console.WriteLine("That's a fake writer who does not care about your message.");
    }
}
假实施:

public class ConsoleWriter : IConsoleWriter
{
    public void Write(string message)
    {
        Console.WriteLine("That's the message: '{0}'", message);
    }
}
public class FakeConsoleWriter : IConsoleWriter
{
    public void Write(string message)
    {
        Console.WriteLine("That's a fake writer who does not care about your message.");
    }
}

现在,定义了所有这些,我使用以下场景:

    static void TestTemporaryStub()
    {
        // register the regular implementation as default
        ObjectFactory.Initialize(x => x.For<IConsoleWriter>().Use<ConsoleWriter>());

        var writer1 = ObjectFactory.GetInstance<IConsoleWriter>();
        writer1.Write("abc");

        // temporarily inject a fake implementation
        ObjectFactory.Inject(typeof(IConsoleWriter), new FakeConsoleWriter());

        var writer2 = ObjectFactory.GetInstance<IConsoleWriter>();
        writer2.Write("abc");

        // attempt to reset the settings to default
        ObjectFactory.ResetDefaults();

        var writer3 = ObjectFactory.GetInstance<IConsoleWriter>();
        writer3.Write("abc");
    }
static void TestTemporaryStub()
{
//将常规实现注册为默认值
初始化(x=>x.For().Use());
var writer1=ObjectFactory.GetInstance();
书写者1.书写(“abc”);
//临时注入一个伪实现
Inject(typeof(IConsoleWriter),new FakeConsoleWriter());
var writer2=ObjectFactory.GetInstance();
书写者2.书写(“abc”);
//尝试将设置重置为默认值
ResetDefaults();
var writer3=ObjectFactory.GetInstance();
书写者3.书写(“abc”);
}
在上面的代码中,我要求StructureMap容器检索IConsoleWriter imnplementation三次:

  • 在容器初始化为使用常规实现后-它返回常规实现->确定
  • 注入假实现->后,它返回假实现->确定
  • 恢复到默认值后->应返回常规实现(ConsoleWriter),但仍返回假->不确定

  • 我在这里遗漏了什么吗?

    因为您想要用存根替换依赖项,所以我假设您想要编写一个单元测试。如果确实是这样,那么最好不要使用容器进行单元测试:你是对的。我只是看到有文件证明它是以这种方式工作的,在给定的场景中,这似乎是最容易做到的事情。如果我需要一个容器(例如集成测试),那么我最好使用一个完全不同的容器,专门为此而构建,而不是试图修补现有的容器。我相信这种方法是集成单元测试和模拟/存根的第一步。它主要用于不自动连接整个objectgraph,而是直接从ObjectFactory或使用ServiceLocator(也是反模式)获取对象的情况。另一种更好的方法是使用Structuremap作为automocker,这与Mark Seemans完全相同。我在要点中添加了我的复制代码: