【发布时间】:2018-10-18 23:04:23
【问题描述】:
我正在构建一个 Windows 窗体应用程序,它使用静态 MessageBox.Show() 方法不时显示一个 MessageBox。
我将静态调用包装在一个 Repository 对象中,如这个问题所示:How to use Dependency Injection with Static Methods?
在 MainClass 中,这个 Repository 对象默认使用原来的静态调用,但是 MainClass 还提供了一个方法 SetMessageBoxRepoDependency() 来设置这个 Repository 对象。这为依赖注入打开了选项。这样做的一个用途是使用模拟工具来引用 Repository 接口,并教导模拟的 Show 方法在测试期间不要创建真正的 MessageBox。
但是,MainClass 还创建了许多使用此 Repository 实例的其他对象。如何修改我的代码,以便在调用 MainClass 的 SetMessageBoxRepoDependency() 时,其他对象也将使用新的存储库?
(我可以修改 MainClass 的构造函数以接收自定义 Repository,但想知道在 MainClass 创建后如何设置 Repository)
主类
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);
}
【问题讨论】:
-
这根本不像“依赖注入”。那里有所有的“新”关键字,根本没有依赖注入,你需要一个容器类来管理你的对象及其生命周期,并用 container.Resolve
替换你的所有新 ClassXXX() 如果你 MainClass 是你的复合根。 -
@LeY 我不认为这个类应该调用
container.Resolve<>(),它应该像其他所有类一样通过构造函数传递。 -
这个
messageBoxRepo = new MessageBoxRepository();不是DI... -
@LeY,如果
MainClass是应用程序的入口点,那么使用new构建应用程序的对象图是正确的地方。请注意,依赖注入不需要框架或容器。 Container是DI框架的实现细节。