了解 C# FromServices
Understanding C# FromServices
所以 iv 刚刚在工作中被扔进了一些新代码,它是在 C# 中。现在我对 C# 不是很熟悉,有些东西我真的不明白,主要的是注入方法。
现在有一个 WebAPI,它有一个使用 class 名为“LocalFileStorage”的控制器,它是另一个项目的依赖项,class 的构造函数如下所示。
public class LocalFileStorageHandler : IStorageHandler
{
*Bunch of private variables
public LocalFileStorageHandler(DbContext dbContext, IConfiguration configuration, ILogger<LocalFileStorageHandler> logger)
{ code here}
现在在控制器中 class 每个使用 LocalFileStorage 的方法都将其作为参数注入。这是一个例子:
public async Task<IActionResult> ApiMapper([FromBody] dynamic request, [FromServices] IStorageHandler storageHandler)
同样在项目startup.cs中我们可以找到这一行:
services.AddScoped<IStorageHandler, LocalFileStorageHandler>();
现在我的理解是,对于每个单独的请求,Addscoped 确保该方法获得它自己的 LocalFileStorage 处理程序实例。我也明白“[FromServices]”属性导致这个实例被注入到方法中。但是,我不明白并且无法在代码中的任何地方找到的一件事是 LocalFileStorage 对象在何处为其构造函数获取“In 参数”?
据我了解,每个注入的 LocalFileStorage 实例还应该接收参数:
DbContext dbContext, IConfiguration configuration, ILogger<LocalFileStorageHandler> logger
我在这里错过了什么?
亲切的问候
DI 容器为您注入依赖项。所以在某处,DbContext、IConfiguration 和 ILogger 已经 registered/setup。
然后当你使用 FromServices 属性时,DI 容器会尝试为你解析类型并注入所有依赖项(如果它们已注册,否则将抛出异常)
IConfiguration 和 ILogger 通常在构建主机时设置。 DbContext(通常)使用 AddDbContext 扩展方法注册。
Link 到 ILogger 的配置:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-6.0#logging-providers
Link 到 IConfiguration 的配置:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-6.0#default-configuration
Link ASP.Net 核心中的依赖注入基础:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-6.0
所以 iv 刚刚在工作中被扔进了一些新代码,它是在 C# 中。现在我对 C# 不是很熟悉,有些东西我真的不明白,主要的是注入方法。
现在有一个 WebAPI,它有一个使用 class 名为“LocalFileStorage”的控制器,它是另一个项目的依赖项,class 的构造函数如下所示。
public class LocalFileStorageHandler : IStorageHandler
{
*Bunch of private variables
public LocalFileStorageHandler(DbContext dbContext, IConfiguration configuration, ILogger<LocalFileStorageHandler> logger)
{ code here}
现在在控制器中 class 每个使用 LocalFileStorage 的方法都将其作为参数注入。这是一个例子:
public async Task<IActionResult> ApiMapper([FromBody] dynamic request, [FromServices] IStorageHandler storageHandler)
同样在项目startup.cs中我们可以找到这一行:
services.AddScoped<IStorageHandler, LocalFileStorageHandler>();
现在我的理解是,对于每个单独的请求,Addscoped 确保该方法获得它自己的 LocalFileStorage 处理程序实例。我也明白“[FromServices]”属性导致这个实例被注入到方法中。但是,我不明白并且无法在代码中的任何地方找到的一件事是 LocalFileStorage 对象在何处为其构造函数获取“In 参数”?
据我了解,每个注入的 LocalFileStorage 实例还应该接收参数:
DbContext dbContext, IConfiguration configuration, ILogger<LocalFileStorageHandler> logger
我在这里错过了什么?
亲切的问候
DI 容器为您注入依赖项。所以在某处,DbContext、IConfiguration 和 ILogger 已经 registered/setup。
然后当你使用 FromServices 属性时,DI 容器会尝试为你解析类型并注入所有依赖项(如果它们已注册,否则将抛出异常)
IConfiguration 和 ILogger 通常在构建主机时设置。 DbContext(通常)使用 AddDbContext 扩展方法注册。
Link 到 ILogger 的配置:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-6.0#logging-providers
Link 到 IConfiguration 的配置:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-6.0#default-configuration
Link ASP.Net 核心中的依赖注入基础:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-6.0