4

我真的很喜欢依赖注入的想法。我在应用这个概念时遇到了麻烦,因为我看到的大多数示例都是针对 ASP.NET MVC 的。

这是我得到的:WPF -> 服务 -> 存储库。服务会注入存储库,而我的视图模型(至少一个,无论如何)会注入服务。

然后在我的 WPF App.xaml 中,我将覆盖 OnStartup 方法。这是我创建 Ninject 并解决我的第一个视图的地方。

当涉及到多个视图时,我会迷路。例如,假设我将 ServiceA 和 ServiceB 注入到我的第一个视图模型中(在 App.xaml 中)。假设我希望 ServiceC 在另一个视图模型的构造函数中,我将如何将它注入到构造函数中?

在代码中,它是这样的:

public class ViewModel1
{
    private readonly IServiceA serviceA;
    private readonly IServiceB serviceB;

    public ViewModel1(IServiceA serviceA, IServiceB serviceB)
    {
        this.serviceA = serviceA;
        this.serviceB = serviceB;
    }

    public void OpenASettingsWindow()
    {
        // How do I resolve this view?
        var window = new View(new ViewModel2(new ServiceC()));
    }
}
4

2 回答 2

5

您需要一个创建View. 工厂构造函数将具有ServiceC参数。然后你需要将工厂注入到ViewModel1. 下面的代码基于您的代码。理想情况下,ViewModel1不需要对View类有任何了解——它应该处理更多的抽象接口,比如IWhateverWindow可以有Show.

public class ViewFactory
{
    private ServiceC _serviceC;

    public VewFactory(ServiceC serviceC)
    {
        _serviceC = serviceC;
    }

    public View CreateView()
    {
        return new View(new ViewModel(_serviceC));
    }
}

public class ViewModel1
{
    private readonly IServiceA serviceA;
    private readonly IServiceB serviceB;
    private ViewFactory _viewFactory;

    public ViewModel1(IServiceA serviceA, IServiceB serviceB, ViewFactory viewFactory)
    {
        this.serviceA = serviceA;
        this.serviceB = serviceB;
        _viewFactory = viewFactory;
    }

    public void OpenASettingsWindow()
    {
        // How do I resolve this view?
        var window = _viewFactory.CreateView();
    }
}
于 2013-10-23T23:37:46.260 回答
0

直接在 ViewModel 的代码中创建 View 主要违反了 MVVM 原则。ViewModels 应该不知道 Views。有很多方法可以以 MVVM 方式打开窗口。您可以在这个答案中看到其中的一些。

于 2013-12-16T11:13:07.807 回答