正确获取IHostingServices实例的方法

时间:2015-05-04 21:08:35

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

在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或其他什么?

1 个答案:

答案 0 :(得分:0)

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

您可能需要两种主要方式来恢复依赖关系:

  1. 使用构造函数
  2. 创建类的实例时
  3. 调用方法时
  4. <强> 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。调用方法时

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

    如果在调用方法时解析依赖关系,则最好解析方法之外的依赖关系,并使用类型提示的接口将其作为参数传递,因为这允许在方法中传递不同的类型请致电,以便您不仅限于那些注册为瞬变的人。

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