Я создаю приложение Windows Forms, которое время от времени отображает MessageBox, используя статический метод MessageBox.Show ().
Я поместил статический вызов в объект Repository, как показано в этом вопросе: Как использовать внедрение зависимостей со статическими методами?
В MainClass этот объект репозитория по умолчанию использует исходный статический вызов, но MainClass также предоставляет метод SetMessageBoxRepoDependency (), который устанавливает этот репозиторий.объект.Это открывает возможности для внедрения зависимости.Одним из применений этого является использование инструмента-насмешки для ссылки на интерфейс Repository и обучение методу-макету Show не создавать реального MessageBox во время тестирования.
Однако MainClass также создает ряд других объектов, которые используютэтот репозиторий экземпляр.Как я могу изменить свой код так, чтобы при вызове SetCessageBoxRepoDependency () MainClass другие объекты также использовали новый репозиторий?
(я могу изменить конструктор MainClass, чтобы он брал собственный репозиторий, но хотел бы знать, как можно установить репозиторий после создания MainClass)
MainClass
public class MainClass
{
private IMessageBoxRepository messageBoxRepo;
public MainClass()
{
messageBoxRepo = new MessageBoxRepository();
// Just classes that reference the same Repository
var classA = new ClassA(messageBoxRepo);
var classB = new ClassB(messageBoxRepo);
var classC = new ClassC(messageBoxRepo);
}
public void SetMessageBoxRepoDependency(IMessageBoxRepository messageBoxRepo)
{
this.messageBoxRepo = messageBoxRepo;
}
}
MessageBoxRepository
public class MessageBoxRepository : IMessageBoxRepository
{
public DialogResult Show(string text)
{
return MessageBox.Show(text); // The original static call.
}
}
IMessageBoxRepository
public interface IMessageBoxRepository
{
DialogResult Show(string text);
}