C# 使用IoC将参数从一个ViewModel传递到另一个ViewModel
我试图从MainViewModel中实例化SecondViewModel,并在第二个参数中注入IoCContainer中注册的服务和MainVM中的对象 代码是这样的: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
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。