c# - IoC - 使用注入的对象参数解析 WPF 窗口
问题描述
我第一次尝试使用 IoC 容器。一个程序有许多不同类型的窗口,这些窗口通常通过MainWindow
. 但是,原则上它也可以在链条的下游。这些窗口通常需要注入一个或多个单例类,我们在这里命名它们IManager1/2/3
。那么,我是否需要将它们冒泡IManagers
,MainWindow
或者我可以在根目录(在此处App class
)解决每个窗口?
无论哪种情况,这将如何完成?
我不需要使用 DryIoc,但这正是我选择测试的。
public partial class App : Application
{
DryIoc.Container container = new DryIoc.Container();
private void Application_Startup(object sender, StartupEventArgs e)
{
RegisterIoc();
var mainwindow = new MainWindow();
mainwindow.Show();
}
public void RegisterIoc()
{
container.Register<IManager1, Manager1>(Reuse.Singleton);
container.Register<IManager2, Manager2>(Reuse.Singleton);
container.Register<IManager3, Manager3>(Reuse.Singleton);
}
}
public MainWindow()
{
public MainWindow()
{
}
void OpenNewWindow2()
{
var w = new Window2(?, ?, ?);
w.Show();
}
}
public class Window2
{
IManager1 man1;
IManager2 man2;
IManager3 man3;
public Window2(IManager1 man1, IManager2 man2, IManager3 man3)
{
this.man1 = man1;
this.man2 = man3;
this.man3 = man3;
}
}
解决方案
考虑遵循显式依赖原则并Window2
依赖MainWindow
例如
public class MainWindow {
private readonly Func<Window2> window2;
public MainWindow(Func<Window2> window2) {
this.window2 = window2;
}
public void OpenNewWindow2() {
var window = window2(); // invoke factory delegate
window.Show();
}
}
上面显示了使用 aFunc<T>
作为工厂委托,它将充当所需依赖项的延迟解析的包装器。每次调用工厂委托时,它都会解析 的新实例,从而取消手动初始化它Window2
的控制;MainWindow
App.Application_Startup
用作组合根,您可以在其中向容器注册所有内容并解析您MainWindow
的根对象
public partial class App : Application {
DryIoc.Container container;
private void Application_Startup(object sender, StartupEventArgs e) {
container = RegisterIoc();
var mainwindow = container.Resolve<MainWindow>();
mainwindow.Show();
}
private DryIoc.Container RegisterIoc() {
var container = new DryIoc.Container();
container.Register<MainWindow>();
container.Register<Window2>();
container.Register<IManager1, Manager1>(Reuse.Singleton);
container.Register<IManager2, Manager2>(Reuse.Singleton);
container.Register<IManager3, Manager3>(Reuse.Singleton);
return container;
}
}
请注意,要解析窗口,您还需要确保它们也已注册到容器中。
推荐阅读
- reactjs - 在异步数据加载中使用 redux 的正确方法
- python - 如何根据Python中的特定条件将json的特定部分存储在变量中?
- javascript - 使用本机反应将数据添加到现有 JSON 文件
- scala - Intellij 社区版坚持使用 Scala 和 SBT
- python - 如何删除文件夹中的所有全黑图像?
- android - TelecomManager.ACTION_CHANGE_DEFAULT_DIALER 在华为 P8 Lite 上返回 RESULT_CANCELED
- android - android中的广播有什么用?
- c++ - 即使设置了 LD_LIBRARY_PATH ,dlopen() 也会在同一目录中找到一个 lib,但在不同的目录中找不到
- flutter - Flutter :- 如何在 Flutter 中解析模型类中的 JSON?
- python - 我可以创建克隆的克隆吗?