【问题标题】:Correct way to get instance of IHostingServices获取 IHostingServices 实例的正确方法
【发布时间】:2015-05-04 21:08:35
【问题描述】:

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

使用属性...

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

作为通过 Startup 类中的 configure 方法传递的参数...

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

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

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

目前尚不清楚使用哪种方法正确。

作为一个不清楚的例子,如果调用需要从 Startup 类中实现 IHostingEnvironment 的类的实例的方法,是否应该将该实例作为方法调用中的参数传递, 应该使用 DI 还是别的什么?

【问题讨论】:

  • 我会说它们都是一样的。只需选择对您最方便的一个即可。

标签: c# asp.net asp.net-core


【解决方案1】:

经过大量研究,我得出以下结论:

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

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

1.创建类的实例时

使用属性...

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

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

作为通过 Startup 类中的 configure 方法传递的参数...

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

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

或者通过使用 DI...

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

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

2。调用方法时

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

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

查看以下链接了解更多信息:

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多