【发布时间】:2020-03-21 21:58:02
【问题描述】:
我正在使用 .NET core 3.1 创建一个 WPF 应用程序 我过去开发过 ASP.Net 应用程序,我很高兴能在 WPF 中使用它。我做了一些搜索,发现 WPF 中的 DI 不像 ASP.Net 中那么简单,这意味着您必须注册 Views 和 ViewModels。
我的结构是这样的
MainWindow
|---BalanceIntegrationPage
|---BalanceIntegrationViewModel
一切都在 XAML 中处理,MainWindow.xaml.cs 仅生成代码,而 BalanceIntegrationPage.xaml.cs 在构造函数中添加了一行
DataContext = new ScaleIntegrationViewModel();
这无法在 xaml 中处理,因为 DI 需要构造函数中的参数。
这是我的 app.xaml.cs:
protected override async void OnStartup(StartupEventArgs startupEventArgs)
{
base.OnStartup(startupEventArgs);
ServiceCollection services = new ServiceCollection();
services.AddScoped<MainWindow>();
services.AddScoped<ScaleInterfacePage>();
services.AddScoped<ScaleIntegrationViewModel>();
services.AddScoped<IScale>(provider => new Scale("1234"));
ServiceProvider serviceProvider = services.BuildServiceProvider();
MainWindow mainWindow = serviceProvider.GetService<MainWindow>();
mainWindow.Show();
}
我的 ScaleIntegrationViewModel 看起来像:
public ScaleIntegrationViewModel(IJMDataIntegration jmContext = null, IBalanceIntegrationContext localContext = null, IScale scale = null)
{
_jmContext = jmContext ?? new JMDataIntegration();
_localContext = localContext ?? new BalanceIntegrationContext();
_scale = scale ?? new Scale("1234");
//JK read from config
_commPort = "1234";
}
我也尝试使用here 描述的模式
当我单步执行代码时,ViewModel 构造函数中的 IScale 对象始终为 null。
有什么建议吗??
编辑:
根据评论,我删除了页面构造函数中的 ViewModel 调用,而是将其分配到 .xaml 这迫使我创建一个默认的无参数构造函数,然后破坏 DI。
似乎我需要将服务注入 MainWindow ctor,然后将它们传递给我从那里调用的所有内容。对我来说毫无意义,因为到那时,我还不如扔掉 DI 并在需要时重新使用它们。
【问题讨论】:
-
您手动实例化您的视图模型并且不为构造函数参数提供任何值,因此使用默认的
null值。你到底有什么不清楚的地方? -
@dymanoid 那么我将如何设置它以使用 DI 呢?我根据我从您的评论中尝试的内容编辑了这个问题。有什么建议吗?
-
你真的应该使用 MVVM 框架,大多数都内置了 DI。
-
@mxmissile 依赖注入是 .NET Core 3.1 的一个特性,所以这应该可以在本地完成。如果我想使用框架或其他东西,我会回到使用 UnityContainers 并以这种方式进行 DI,就像我在完整的框架应用程序中所做的那样。目标是在这个项目中使用本机 DI。不过谢谢!
-
“意味着你必须注册 Views 和 ViewModels” - 这取决于你使用的框架,以及你是否按照约定依赖依赖映射而不是明确定义它.依赖约定方法只是意味着魔术在后台发生。
标签: c# wpf mvvm dependency-injection .net-core-3.1