在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或其他什么?
答案 0 :(得分:0)
经过广泛的研究,我得出了以下结论:
您可能需要两种主要方式来恢复依赖关系:
<强> 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。调用方法时
在这种情况下,应该在构造函数中解析依赖项,除非不可能调用该方法,因为出于性能原因,您可能希望延迟依赖项的解析,直到需要依赖项为止。
如果在调用方法时解析依赖关系,则最好解析方法之外的依赖关系,并使用类型提示的接口将其作为参数传递,因为这允许在方法中传递不同的类型请致电,以便您不仅限于那些注册为瞬变的人。
有关详细信息,请参阅以下链接: