gpt4 book ai didi

c# - 带 MVVM + WPF 的纯 DI

转载 作者:行者123 更新时间:2023-12-03 10:19:18 25 4
gpt4 key购买 nike

在 MVVM 之后尝试将纯 DI(即无框架)与 WPF 一起使用非常困难。我有马克·西曼的书;但是,他对此的解决方案似乎与我想出的非常相似:

public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);

string connectionString = @"Server=(localdb)\MSSQLLocalDB;Database=RouteMiningDB;Trusted_Connection=True;";
RouteMiningDAL.RouteMiningDataContext db = new RouteMiningDAL.RouteMiningDataContext(new DbContextOptionsBuilder().UseSqlServer(connectionString).Options);
IZIPCodeInfoRepository zipCodeRepo = new RouteMiningDAL.SQLZIPCodeInfoRepository(db);
ZIPCodeInfoService zipCodeInfoService = new ZIPCodeInfoService(zipCodeRepo);

ZIPCodeInfoViewModel zipCodeInfoViewModel = new ZIPCodeInfoViewModel(zipCodeInfoService);
ZIPCodeInfoView zipCodeInfoView = new ZIPCodeInfoView(zipCodeInfoViewModel);

MainWindow mainWindow = new MainWindow();
mainWindow.Content = zipCodeInfoView;
mainWindow.Show();
}
}
根据其他资源以及 Mark 的书,OnStartup 用作组合根。一切似乎都在上面,但是,我觉得我能做的非常有限。例如,我设置了 ZIPCodeInfoViewmainWindow.Content .显然有许多子窗口,例如:
Window w/Child Windows
这给布局带来了一些挑战,因为我真的不能将它设置为 xxxx.Content (我可以猜,但我不想在代码中构造布局)。我该怎么做?我是否忽略了在 XAML 中执行此操作的能力?似乎 XAML 需要一个无参数的构造函数,这显然不适用于 DI 的构造函数注入(inject)。谢谢!
免责声明:我想使用纯 DI。

最佳答案

很高兴您想使用纯 DI。你的问题很好。我希望这本书的第 2 版能回答这个问题。如果我没记错的话,它没有一个简单的例子/答案。

但是,Pure DI 的想法是所有依赖项在应用程序入口点(即组合根)中都是可见的(使用构造注入(inject))。

在您的情况下,我将通过以下方式将其链接起来:
公共(public)部分类应用程序:应用程序
{
protected 覆盖无效 OnStartup(StartupEventArgs e)
{
base.OnStartup(e);

    string connectionString = @"Server=(localdb)\MSSQLLocalDB;Database=RouteMiningDB;Trusted_Connection=True;";
RouteMiningDAL.RouteMiningDataContext db = new RouteMiningDAL.RouteMiningDataContext(new DbContextOptionsBuilder().UseSqlServer(connectionString).Options);
IZIPCodeInfoRepository zipCodeRepo = new RouteMiningDAL.SQLZIPCodeInfoRepository(db);
ZIPCodeInfoService zipCodeInfoService = new ZIPCodeInfoService(zipCodeRepo);
StockHistoryService stockHistoryService = StockHistoryService();
StockHistoryViewModel stockHistoryViewModel = new StockHistoryViewModel(stockHistoryService);

ZIPCodeInfoViewModel zipCodeInfoViewModel = new ZIPCodeInfoViewModel(zipCodeInfoService, stockHistoryViewModel);
ZIPCodeInfoView zipCodeInfoView = new ZIPCodeInfoView(zipCodeInfoViewModel);

MainWindow mainWindow = new MainWindow();
mainWindow.Content = zipCodeInfoView;
mainWindow.Show();
}

}

这样,主窗口依赖于 StockHistoryViewModel,而后者又依赖于 StockHistoryService。
对于某些 View 模型(弹出/模态窗口等),我会使用带有 DI 的工厂模式,以便仅在需要时/如果需要时创建 View 模型。但它隐藏了 View 模型的依赖...
Dependency Injection vs Factory Pattern

关于c# - 带 MVVM + WPF 的纯 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49523723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com