如何将ILogger <T>从剃须刀页面传递到另一个类?

时间:2020-04-27 23:21:56

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

我正在尝试在服务器端Blazor应用中设置日志记录。

这是我从API获取数据的类:

public class LicenseService
{
    private ILogger _logger;

    public LicenseService(ILogger<LicenseService> logger)
    {
        _logger = logger;
    }

    public async Task<List<Licenses>> GetLicensesAsync()
    {                
        List<Licenses> model = null;
        var client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
        var task = await client.GetAsync("https://my.domain/v1/licenses");
        if(!task.IsSuccessStatusCode)
        {
            _logger.LogError($"Result was {task.StatusCode}");
        }
        _logger.LogError($"Result was {task.StatusCode}");
        var jsonString = await task.Content.ReadAsStringAsync();
        model = JsonConvert.DeserializeObject<List<Licenses>>(jsonString);
        return model;
    }
}

这是一个调用该类的.razor页面。我要向new LicenseService();传递什么?我无法实例化IloggerIlogger<LicenseService>的新实例。

private async Task<List<Licenses>> GetLicenseData()
{
    LicenseService service = new LicenseService();
    var licenseData = await service.GetLicensesAsync();
    return licenseData;
}

我确定这是因为我不太了解dotnet核心中的依赖项注入是如何工作的。

1 个答案:

答案 0 :(得分:1)

理想情况下,如果您按照设计的方式使用依赖项注入,则根本不会在那里创建一个新的LicenseService实例,而是注入依赖项,顾名思义。

>

在启动过程中,您可能需要进行以下服务注册(或类似的注册)。

services.AddScoped<LicenseService>();

在您的Razor页面的构造函数中,服务容器现在可以自动为您解决此依赖关系,同时还假设所有这些 依赖关系也得到了照顾。

public class YourPageModel : PageModel
{
    private readonly LicenseService _licenseService;

    public YourPageModel (LicenseService licenseService)
    {
        _licenseService = licenseService;
    }

    public async Task<List<Licenses>> GetLicenseData()
    {
        var licenseData = await _licenseService.GetLicensesAsync();
        return licenseData;
    }
}

更新

可以使用顶部的以下语法通过DI将服务注入到Blazor组件中:

@inject LicenseService licenseService

,然后在您的方法中引用为licenseService。有关示例,请参见此链接:

https://docs.microsoft.com/en-us/aspnet/core/tutorials/build-your-first-blazor-app?view=aspnetcore-3.1#dependency-injection