我一直在阅读依赖注入,我从中理解的是,你基本上只是将实例从1位置的顶部传递(例如App.xml.cs
向下传递给View,它是ViewModel和类ViewModel使用等等。
希望正确理解这一点,我开始尝试实现这一点。
我有一个类Localizer : ILocalizer
,其中包含以下构造函数:
Localizer(ResourceDictionary appResDic,
string projectName,
string languagesDirectoryName,
string fileBaseName,
string fallbackLanguage)
我还有一个ExceptionHandler : IExceptionHandler
使用这个类,所以我的构造函数看起来像这样:
ExceptionHandler(ILocalizer localizer,
string logLocation)
现在是ViewModel。 ViewModel同时使用Localizer
和ExceptionHandler
,因此我的承包商看起来像这样:
MainWindowViewModel(IExceptionHandler exceptionHandler,
ILocalizer localizer)
在此之前,我的View将在使用以下构造函数调用ViewModel时实例化它。
public MainWindowView(IExceptionHandler exceptionHandler, ILocalizer localizer)
{
InitializeComponent();
MainWindowViewModel viewModel = new MainWindowViewModel(exceptionHandler , localizer);
this.DataContext = viewModel;
}
这就是我被困住的地方。我得到以下例外:
'在类型'Noru.Test.Views.MainWindowView'上找不到匹配的构造函数。您可以使用Arguments或FactoryMethod指令来构造此类型。行号“3”和行位置“9”。
内在异常:
找不到类型'Noru.Test.Views.MainWindowView'的默认构造函数。您可以使用Arguments或FactoryMethod指令来构造此类型。
答案 0 :(得分:1)
似乎MainWindowView
是启动视图,根据您提供的代码,View只有一个带参数的构造函数,这意味着它现在没有任何无参数构造函数。所以你需要通知wpf
在App.xaml中
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="App_OnStartup"
>
<Application.Resources>
</Application.Resources>
</Application>
在app.xaml.cs(代码隐藏)
private void App_OnStartup(object sender, StartupEventArgs e)
{
var mainWindowView = new MainWindowView(localizer); <--- you need to inject constructor argument here.
mainWindowView.Show()
}