Зарегистрируйте асинхронный фабричный метод с параметрами в контейнере DI ASP.NET Core.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Зарегистрируйте асинхронный фабричный метод с параметрами в контейнере DI ASP.NET Core.

Сообщение Anonymous »

У меня есть следующий (довольно упрощенный) код:

Код: Выделить всё

public class Service
{
private IPage? _page;

private readonly ScreenshotOptions _options;

public Service(IOptions options) => _options = options.Value;

public async Task CreateScreenshotAsync()
{
if (_page == null)
_page = await InitializePlaywrightAsync();

await _page.ScreenshotAsync(new PageScreenshotOptions { Path = _options.Filename });

// all the other stuff
}

private async Task InitializePlaywrightAsync()
{
var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync();
var page = await browser.NewPageAsync();
await page.SetViewportSizeAsync(_options.Width, _options.Height);

return page;
}
}

// Program.cs
builder.Services.AddSingleton();
Я бы предпочел, чтобы InitializePlaywrightAsync() находился не внутри Service, но пусть контейнер DI ASP.NET Core выполняет работу по созданию экземпляра IPage . К сожалению, следующий код не компилируется:

Код: Выделить всё

public class Service
{
private IPage _page;

private readonly ScreenshotOptions _options;

public Service(IOptions options, IPage page)
{
_options = options.Value;
_page = page;
}

public async Task CreateScreenshotAsync()
{
await _page.ScreenshotAsync(new PageScreenshotOptions { Path = _options.Filename });

// all the other stuff
}
}

// Program.cs - compilation error
builder.Services.AddSingleton((IOptions options) =>
{
var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync();
var page = await browser.NewPageAsync();
await page.SetViewportSizeAsync(options.Width, options.Height);

return page;
});
builder.Services.AddSingleton();
Использовать выделенный фабричный класс также не очень удобно, поскольку контейнер DI не принимает асинхронный делегат:

Код: Выделить всё

public class PageFactory
{
private readonly ScreenshotOptions _options;

public PageFactory(IOptions options) => _options = options.Value;

public async Task InitializePlaywrightAsync()
{
var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync();
var page = await browser.NewPageAsync();
await page.SetViewportSizeAsync(_options.Width, _options.Height);

return page;
}
}

// Program.cs - compilation error
builder.Services.AddSingleton(async provider => await provider.GetRequiredService().InitializePlaywrightAsync());
Мне любопытно, существует ли какой-нибудь элегантный способ перемещения логики InitializePlaywrightAsync() в контейнер DI.


Подробнее здесь: https://stackoverflow.com/questions/764 ... -container
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»