Как передать ILogger <T>со страницы бритвы в другой класс? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь настроить ведение журнала в моем приложении 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();? Я не могу создать новый экземпляр Ilogger или Ilogger<LicenseService>.

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

Я уверен, что это потому, что я не совсем понимаю, как работает внедрение зависимостей в ядре do tnet.

1 Ответ

1 голос
/ 28 апреля 2020

В идеале, если вы используете внедрение зависимостей в том виде, как оно было спроектировано, вы бы вообще не создавали там новый экземпляр 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;
    }
}

Обновление :

Служба может быть внедрена в ваш Компонент Blazor с DI использует этот синтаксис вверху:

@inject LicenseService licenseService

И затем в вашем методе упоминается как licenseService Смотрите ссылку для примера:

https://docs.microsoft.com/en-us/aspnet/core/tutorials/build-your-first-blazor-app?view=aspnetcore-3.1#dependency -инъекция

...