获取 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 还是其他?
经过广泛的研究,我得出以下结论:
您可能需要通过两种主要方式解决依赖关系:
- 使用构造函数创建 class 的实例时
- 调用方法时
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
在 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 还是其他?
经过广泛的研究,我得出以下结论:
您可能需要通过两种主要方式解决依赖关系:
- 使用构造函数创建 class 的实例时
- 调用方法时
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