【问题标题】:Dependency injection without Ninject没有 Ninject 的依赖注入
【发布时间】:2015-04-21 05:23:05
【问题描述】:

我一直在阅读有关依赖注入的内容,我从中了解到的是,您基本上只是将实例从顶部的 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 指令来构造此类型。

【问题讨论】:

  • 您对问题的一系列更新让我感到困惑。我在下面的回答是否帮助您解决了问题?
  • 确实如此,我不得不将我的问题恢复到原来的问题,因为我是在推导。我刚刚编辑了protected override void OnStartup(StartupEventArgs e) 并在那里添加了我的代码,这与我假设的大致相同。

标签: c# wpf mvvm dependency-injection


【解决方案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()
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多