没有Ninject的依赖注入

时间:2015-04-21 05:23:06

标签: c# wpf mvvm dependency-injection

我一直在阅读依赖注入,我从中理解的是,你基本上只是将实例从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同时使用LocalizerExceptionHandler,因此我的承包商看起来像这样:

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指令来构造此类型。

1 个答案:

答案 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()
    }