Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM中的传递服务_C#_Wpf_Mvvm_Dependency Injection - Fatal编程技术网

C# MVVM中的传递服务

C# MVVM中的传递服务,c#,wpf,mvvm,dependency-injection,C#,Wpf,Mvvm,Dependency Injection,我真的很喜欢依赖注入的想法。但我在应用这个概念时遇到了困难,因为我看到的大多数示例都是针对ASP.NET MVC的 这里是我得到的:WPF->Services->Repository。服务被注入存储库,我的视图模型(至少有一个)被注入服务 然后在我的WPF App.xaml中,我覆盖了OnStartup方法。这就是我创建Ninject并解决第一个视图的地方 当涉及到多个视图时,我会迷失方向。例如,假设我将ServiceA和ServiceB注入我的第一个视图模型(在App.xaml中)。比如说,我

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

这里是我得到的:WPF->Services->Repository。服务被注入存储库,我的视图模型(至少有一个)被注入服务

然后在我的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()));
    }
}

您需要一个创建
视图
实例的工厂。工厂构造函数将具有
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();
    }
}

直接在ViewModel的代码中创建视图是对MVVM原则的主要违反。ViewModels应该不知道视图。有许多方法可以以MVVM方式打开窗口。你可以在这里看到其中的一些