Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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# 使用IoC将参数从一个ViewModel传递到另一个ViewModel_C#_.net_Mvvm_Inversion Of Control_Ioc Container - Fatal编程技术网

C# 使用IoC将参数从一个ViewModel传递到另一个ViewModel

C# 使用IoC将参数从一个ViewModel传递到另一个ViewModel,c#,.net,mvvm,inversion-of-control,ioc-container,C#,.net,Mvvm,Inversion Of Control,Ioc Container,我试图从MainViewModel中实例化SecondViewModel,并在第二个参数中注入IoCContainer中注册的服务和MainVM中的对象 代码是这样的: class MainViewModel { public MainViewModel() { } private string message = "the message"; public string Message { get; set; } } class SecondView

我试图从MainViewModel中实例化SecondViewModel,并在第二个参数中注入IoCContainer中注册的服务和MainVM中的对象

代码是这样的:

class MainViewModel
{
    public MainViewModel()
    {
    }

    private string message = "the message";
    public string Message { get; set; }
}

class SecondViewModel
{
    public SecondViewModel(IService service, string message)
    {
    }
}
现在,我知道我可以让IoC容器将第二个ViewModelFactory(携带服务实例)注入到MainViewModel中,这样它就可以通过它创建SVM,但是如果iSeries的实现非常繁重,我不想实例化它,但是当我真的需要它的时候,该怎么办呢

如果我必须以类似的方式实例化其他ViewModel呢?我是否必须创建成吨的VMFactory和构造函数参数

如果我使用一个通用的ViewModelFactory,它将需要实例化,传递我拥有的每个ViewModel所需的所有服务,不管它们是否将被创建


对于我的情况,您知道更好的解决方案吗?

大多数
IoC容器
支持使用
Lazy
延迟依赖于,以避免立即创建昂贵的类

因此,在代码中,您可以为昂贵的iSeries设备设置lazy:

class SecondViewModel
{
    public SecondViewModel(Lazy<IService> service, string message)
    {
    }
}
class SecondViewModel
{
public SecondViewModel(惰性服务,字符串消息)
{
}
}

您可以使用一些流行的IoC容器,看看它们是如何支持延迟加载的:或者

一般来说,服务的创建不应该很繁重。它们的构造函数应该只存储传入的依赖项。如果它在后台使用了大量资源,则不应通过构造函数访问这些资源。这使构造函数保持简单(防止您必须测试它),并允许非常快速地合成对象图

如果真的没有办法解决这个问题,那么基本上可以应用两种模式:

1。工厂

您可以注入工厂来延迟类型的创建。当创建应明确控制的对象(例如,应尽快处理的实例)时,工厂也很有用。创建工厂有几种方法。有些人喜欢将
Func
Lazy
依赖项注入到他们的服务中,但我发现这太含蓄了。我宁愿注入一个
ISomeServiceFactory
,因为我发现它更可读。缺点是您需要为此定义一个新接口。然而,如果您发现自己有许多工厂接口,那么您可能有一个工厂接口

2。代理

您可以将服务隐藏在代理后面,而不是创建工厂。此代理可以实现与服务相同的接口,并将为您执行延迟执行。这可以防止应用程序依赖于不同的接口(例如
IServiceFactory
Lazy
)。尤其是
Lazy
将创建这种依赖关系的细节泄露给消费者。如果方便的话,您仍然可以将一个
Lazy
注入这个代理。这不是问题。该代理通常是应用程序的一部分,应用程序的其余部分仍然依赖于
iSeries设备,而不是
惰性设备


请注意,工厂、代理和延迟启动的使用确实会使容器的布线复杂化。所以不要使用if,除非你测量到你真的需要它。它们使事情复杂化,因为间接性使它更难在逻辑上遵循。而且它们使得使用自动化测试验证配置变得更加困难。有关验证容器的更多信息,请查看和。

您使用的是哪个IoC容器?我使用的是MVVM Light的SimpleIoC。但我可以改变它,我只是一个试图学习=)的学生,即使容器没有明确支持
惰性
,您也可以简单地注册一个
惰性
。这甚至适用于SimpleIoC。