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