MVVM依赖注入

时间:2012-06-03 17:09:59

标签: mvvm dependencies code-injection

我正在通过将模式划分为核心方面并逐个学习这些方面来自学MVVM模式。

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

感谢。

2 个答案:

答案 0 :(得分:2)

我认为你想要在不使用框架的情况下理解DI是件好事,这个概念并不是非常难以理解。

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

interface ITransportation 
{
  Transport();
}

使用某种运输方式的方法的初始实现可能如下所示:

public void Move()
{
  ITransportation car = new Car();
  car.Transport();
}

该方法的问题在于它现在依赖于Car类。我们应该通过我们的运输对象以增加灵活性。这是控制倒置,与DI密切相关。

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

如您所见,我们不需要了解特定DI框架的任何信息。您可能还想查看ninject DI by hand教程。

答案 1 :(得分:0)

只是为了扩展@Andy的回答

依赖注入是Dependency Inversion Principle

的一种形式

要实现依赖关系的解耦(通常在分层架构中找到), DI通常用于实例化场景,例如基本new()和类似Factory方法的模式。除了每次都能够注入一个新的依赖实例(例如工厂)之外,还可以设置容器以注入命名实例,单例实例等 - 即IoC容器通常还负责管理对象的生命周期同样。

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

回复:“没有Unity等”手工做DI“

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