c# - 带 MVVM + WPF 的纯 DI

标签 c# wpf mvvm dependency-injection

在 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/

相关文章:

c# - 单击表单按钮时,Asp-Page-Handler 不会触发 Razor 模型中的方法

c# - 在 MVVMLight 中接收派生类型的消息

wpf - 选项卡控件上选项卡之间的键盘快捷方式

silverlight - Silverlight3中MVVM绑定(bind)ItemsControl获取父控件DataContext

c# - 我无法在 MVVM 中隐藏窗口

c# - 使用静态类处理 session 数据

c# - 未指定 asp.net mvc 4 默认路由?

c# - 与 ElementName 绑定(bind)不适用于 WPF TabItem 内的动态构造控件

c# - 布局/面板有什么意义?

c# - 如何在MVVM的上下文中处理DataGrid中的页眉单击事件?