2

我是依赖注入的新手。我从来没有使用过,也从来没有完全理解过它到底是什么,但是在我最后一次攻击这个话题之后,我发现这是一种解耦对象及其依赖项的方法,一旦它们不负责实例化它的具体版本不再依赖,因为现在容器将为我们完成它并将准备好的对象交付到我们手中。

现在的重点是;“我什么时候应该使用它?”,总是???实际上,由于我是新手,甚至从未见过使用这种模式的项目,我无法理解我应该如何将它应用到我的域对象!在我看来,我将永远不会实例化我的对象,容器将永远为我做这件事,但随之而来的是一些疑问......

1) 例如,它的部分依赖关系来自 UI 的对象呢?

public class User(String name, IValidator validator)

假设我从 UI 中获取用户名,那么容器如何知道它并仍然为我提供这个对象?

2)我面临的其他情况;如果一个依赖现在是一个已经实例化的对象,比如说......一个 SINGLETON 对象,例如。我看到了有关注入依赖项生命周期的设置(我在谈论 Spring.NET,例如 http 请求范围)...但是,请求和其他与 Web 相关的东西都在我的表示层上,所以我怎么能在不破坏任何设计规则的情况下链接我的表示层和我的域层(因为我的域应该完全不知道它在哪里被消耗,不具有层依赖性等)

我渴望听到你们的消息。非常感谢。

4

3 回答 3

1

1)这个构造器可能不是正确使用的构造器,可能是您将验证器注入到错误的位置/方式。

2)较近的View、Model和Controller都应该知道有一个IoC,它应该位于后台架构中(实际上是MVC组件实例化的地方)

当您觉得架构可能变得复杂并且必须由许多人维护时,您应该使用 IoC。如果您正在编写企业应用程序,或者您认为可以使用插件扩展的 UI,那么您可能需要它,如果您正在编写命令行实用程序,则可能不需要。

于 2011-03-25T17:11:55.560 回答
1

每当您想要以下任何好处时,都应该使用依赖注入:

  • 轻松更换模块的能力
  • 在应用程序的各个部分或不同应用程序之间重用模块的能力
  • 当您想进行并行开发时,系统的组件可以独立并行开发,因为它们依赖于抽象
  • 当您因为松散耦合而想要更轻松地维护系统时
  • 当您需要可测试性(替换模块的专业化)时。这是使用 DI 的最大原因之一

要回答您的其他问题:

1)您可以配置许多 IoC 容器,以便可以指定某些构造函数参数,而其他参数由容器解析。但是,您可能需要考虑重构那段代码,因为 aUserFactory可能更合适,它采用验证器依赖项,并且有一个NewUser采用用户名并返回新用户的方法(直接实例化它或从容器中解析) )。

2)您构建的每个应用程序都有一个组合根,您的容器在其中配置,并且根对象被解析。因此,每个应用程序都有自己的 IoC 配置,因此应用程序类型和配置设置之间存在预期的联系。任何常见的抽象注册都可以放在可以在所有应用程序之间共享的配置代码中。

于 2011-03-25T17:12:13.470 回答
1

通常,一旦您使用 IoC,您往往希望使用 IoC 注册所有内容,并让容器吐出完全水合的对象。但是,您提出了一些有效的观点。

也许“依赖”的定义是有序的;从最广泛的意义上讲,依赖关系只是一组功能(接口),给定类需要具体实现才能使类正常工作。因此,大多数重要的程序都充满了依赖关系。为了便于维护,通常首选所有依赖项的松散耦合。但是,即使松耦合,如果这些对象需要您不想污染 IoC 注册表的专门信息,您也不需要自动实例化依赖项。目标是松散地耦合使用,而不一定是创建。

关于第 1 点,一些 IoC 框架在提供外部参数方面表现不佳。但是,您通常可以将委托注册为工厂方法。该委托可能属于一个对象,例如由 UI 提供外部信息的控制器。登录就是一个完美的例子:创建一个对象,比如一个 LoginController,并将它注册到 IoC 作为你的 ILoginController。您将在登录页面上引用该控制器,它将在登录页面被实例化时被注入,并且登录页面会将输入的凭据传递给它。然后,控制器将执行身份验证,并将有一个方法 GetAuthenticatedUser() 生成一个用户对象。您可以使用 IoC 将此方法注册为用户的工厂,并且每当需要用户时,工厂委托将被评估,

关于第 2 点,设置对象的单个实例是 IoC 模式的优势。无需使用私有实例构造函数、静态实例和静态构造函数来创建一个真正的单例来生成实例,您只需向 IoC 注册该类并告诉它只实例化一次并将该实例用于所有请求。力量就是柔韧性;如果您以后希望有多个实例,则只需更改注册即可。无论哪种方式,您都不会破坏任何设计模式规则;视图将始终注入一个控制器,无论该控制器对于所有页面都是相同的,还是每个请求都有一个新实例。

于 2011-03-25T17:17:17.200 回答