Я использую 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.");
}
}
Теперь, определив все это, я использую следующий сценарий:
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");
}
В приведенном выше коде я прошу контейнер StructureMap три раза получить реализацию IConsoleWriter:
- После того как контейнер инициализирован для использования обычной реализации - он возвращает обычную реализацию -> ОК.
- После внедрения ложной реализации -> возвращает ложную реализацию -> ОК.
- После возврата к значениям по умолчанию -> должен вернуть обычную реализацию (ConsoleWriter), но он все равно возвращает фальшивку -> Not Ok.
Я что-то здесь упускаю?