c# - asp.net 5 自定义类中的依赖注入(inject),正确的方法是什么?

标签 c# dependency-injection asp.net-core asp.net5

试图理解 DI。

在自定义类中使用服务/依赖对象的正确方法是什么?

我是否需要将每个类创建为服务并添加到依赖对象?

或者我应该使用 [FromServices](以前是 beta4 之前的 [Active] )属性。

或者我应该传递一个服务对象来访问它们吗?

我想了解的是,我如何正确编写自己的类以使用像 Controller 等一样的 DI。

最佳答案

[FromServices] 只是一个 MVC 概念。它不适用于 ASP.NET 5 堆栈的其他部分。

如果你想在链中传递依赖关系,你有几个选择:

  1. 通过服务提供商。这是一种非常反模式,因为您的对象需要依赖 DI 容器,而您并没有真正反转控制。
  2. 在构造函数中传递接口(interface)。 “纯”DI 但您最终可能会遇到参数噩梦(在构造函数中采用 10 个参数的对象)。
  3. 与上一个类似,但在工厂中对依赖项进行分组。更多的 DI 对齐和更少的参数噩梦,但它可能会造成工厂噩梦。
  4. 仅注入(inject)顶级大型对象(例如:存储库、整个系统等)。这种方法是依赖噩梦和太多耦合之间的一个很好的权衡。当然,被注入(inject)的系统应该相互独立。此外,每个系统内部都可以有自己的 DI 容器。

!!不要混淆 DI 和配置。当您依赖契约(Contract)时,DI 才有意义。当您需要一些特定于当前实现的信息时,配置很有用。

示例:如果您有一个 IRepository,那么您不应该注入(inject)连接字符串,因为连接字符串特定于您连接的系统。有些情况下连接字符串没有意义。例如,InMemoryRepository 不需要连接字符串,因此这不是所有实现的共同依赖项。

关于c# - asp.net 5 自定义类中的依赖注入(inject),正确的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759403/

相关文章:

c# - FacebookClient GetTaskAsync 有时会返回无效的 JSON 字符串(UWP 10)

symfony - 如何将@request注入(inject)到服务中?

java - Spring MVC,将 Hibernate 服务注入(inject) Spring bean 失败,不知道为什么

asp.net-mvc - 如何在 ASP.NET Core 中启用 ClientCache

iis - 在 IIS (Windows 10) 上托管时,无法在 Web 应用程序中托管使用​​ LocalDB

c# - tcplistener 没有启动

c# - 如何用C#反序列化为IReadOnlyDictionary?

c# - 如何在 C# 中禁用 CodeLens 的引用显示

java - Spring - @Named 和 @Component 之间的区别

asp.net-core - SignalR 核心和跨域请求问题