在 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 用作组合根。一切似乎都在上面,但是,我觉得我能做的非常有限。例如,我设置了 ZIPCodeInfoView
到mainWindow.Content
.显然有许多子窗口,例如:这给布局带来了一些挑战,因为我真的不能将它设置为
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/