获取 IHostingServices 实例的正确方法

Correct way to get instance of IHostingServices

在 ASP.NET 5 核心中有一个接口,IHostingEnvironment,但是查看 ASP.NET 的示例和源代码,有 3 种不同的方法来获取实例。

使用属性...

[FromServices]
public IHostingEnvironment HostingEnvironment { get; set; }

作为通过 Startup 中的配置方法传递的参数 class...

public void Configure(IApplicationBuilder application, IHostingEnvironment environment)
{
}

或者通过在以下任一行中使用 DI...

var hostingEnvironment = requestServices.GetService<IHostingEnvironment>();
var hostingEnvironment = app.ApplicationServices.GetRequiredService<IHostingEnvironment>();

不清楚哪种方法才是正确的使用方法。

举个例子说明它有多不明确,如果对一个方法的调用需要 class 的一个实例,该实例从 Startup class 中实现 IHostingEnvironment,实例作为方法调用中的参数传递,应该使用 DI 还是其他?

经过广泛的研究,我得出以下结论:

您可能需要通过两种主要方式解决依赖关系:

  1. 使用构造函数创建 class 的实例时
  2. 调用方法时

1.创建 class

的实例时

Using an attribute...

[FromServices]
public IHostingEnvironment HostingEnvironment { get; set; }

应该避免这种情况(请参阅本答案末尾的第一个 link),相反,您应该在构造函数中传递依赖项,以便您可以看到 class 何时具有过多的依赖项因此需要重构。

As an argument passed via the configure method in the Startup class...

public void Configure(IApplicationBuilder application, IHostingEnvironment environment)
{
}

您需要确保要构建的 class 已在 DI 容器中注册,然后您将使用 DI 创建 class 的实例(请参阅第二个 link 在此答案的末尾)。

Or by using DI...

var hostingEnvironment = app.ApplicationServices.GetRequiredService<IHostingEnvironment>();

这似乎是解决依赖关系的首选方法,因为它确保您永远不必使用 new 关键字。

2。调用方法时

在这种情况下,除非不太可能调用该方法,否则应在构造函数中解析依赖关系,因为出于性能原因,您可能希望延迟解析依赖关系,直到需要依赖关系为止。

如果在调用方法时解决了依赖关系,则最好在方法外部解决依赖关系,并使用类型提示的接口将其作为参数传入,因为这允许传入不同的类型方法调用,这样您就不会局限于那些注册为瞬态的方法。

有关详细信息,请参阅以下 link:

  • Dependency injection inside a FilterAttribute in ASP.NET MVC 6