MVVM依赖注入

MVVM依赖注入,mvvm,dependencies,code-injection,Mvvm,Dependencies,Code Injection,我正在自学MVVM模式,将模式划分为核心方面,并逐一学习这些方面 我的问题与依赖注入有关。它是什么,我为什么/什么时候应该使用它?我看过Jason Dolinger精彩的MVVM介绍视频,我看到他使用Unity。问这个问题可能有点奇怪,但是如果不使用Unity,我如何实现依赖注入呢?我基本上想理解依赖注入的概念,以及如何在不必实现其他框架/工具的情况下使用它(目前) 谢谢。我认为如果你想不使用框架就理解DI是件好事,这个概念并不难理解 假设你想使用某种形式的交通工具 interface ITra

我正在自学MVVM模式,将模式划分为核心方面,并逐一学习这些方面

我的问题与依赖注入有关。它是什么,我为什么/什么时候应该使用它?我看过Jason Dolinger精彩的MVVM介绍视频,我看到他使用Unity。问这个问题可能有点奇怪,但是如果不使用Unity,我如何实现依赖注入呢?我基本上想理解依赖注入的概念,以及如何在不必实现其他框架/工具的情况下使用它(目前)


谢谢。

我认为如果你想不使用框架就理解DI是件好事,这个概念并不难理解

假设你想使用某种形式的交通工具

interface ITransportation 
{
  Transport();
}
使用某种形式的传输的方法的初始实现可能如下所示:

public void Move()
{
  ITransportation car = new Car();
  car.Transport();
}
该方法的问题在于它现在依赖于一个Car类。为了增加灵活性,我们应该把我们的运输工具交进去。这是控制反转,与DI密切相关

public void Move(ITransportation tr)
{
  tr.Transport();
}

正如您所看到的,我们不需要了解任何关于特定DI框架的信息。您可能还想查看教程。

只是为了扩展@Andy的答案

依赖项注入是

为了实现依赖关系的解耦(如分层体系结构中的典型情况), DI通常用于实例化场景,如基本new()和工厂方法等模式。除了能够每次注入一个新的依赖实例(如factory),还可以设置容器来注入命名实例、单实例等,即IoC容器通常还负责管理对象的寿命

一个潜在的“心态转变”是依赖关系现在可能在具体类上公开可见,因为DI通常通过构造函数或公共Get/Set属性进行注入。如果您习惯于使用OO封装,那么这可能看起来很奇怪,在OO封装中,类的依赖项被视为实现,并且应该对“外部”即类方法签名隐藏。 但是,通过实现接口/具体类分离(您应该这样做,不仅是为了解耦,也是为了测试/模拟目的),注入构造函数/属性注入方法将不在接口上,因此封装再次到位

Re:“用手做DI”而不统一等


您需要做的是编写自己的IoC容器,然后它负责“构建”类的实例-在每次“构建”期间,您将扫描类以查找依赖项(在容器中进行配置,例如通过配置、属性或仅仅通过约定进行配置,例如,所有公共可设置属性或构造函数上的任何类参数都将假定为依赖项)。然后,您将创建(如果需要)并将此“依赖项”实例注入对象(例如,通过使用反射)。然后递归地,需要建立这些依赖项的所有依赖项等。然后,您还需要为每个对象提供寿命管理,例如单例对象等。

感谢Andy的回答。那么,我是否正确地指出,在视图和视图模型的上下文中,依赖项注入用于“解耦”从它的基础视图模型中的视图?多了解一点上下文可能会有帮助。我们是在谈论WPF/Silverlight还是其他东西?嗨,我正在WPF的上下文中研究DI。@AndyGaskell嗨,你能看看我的吗?它也与依赖项注入有关