Разрешение службы внедрения зависимостей как части построителя при указании параметров

Я использую Microsoft.Extensions.DependencyInjection в своем проекте ASP.NET Core (нацеленном на .NET 7.0).

У меня есть служба, которая при наличии значительного числа внедренных других служб дает строковое значение, которое мне нужно для заполнения метода параметров во время моей регистрации DI. Как правило, я просто заставляю DI внедрять службу в любой из контроллеров, в которых я извлекаю различные необходимые значения, но здесь ситуация немного отличается.

Здесь я использую один из тех многих полезных методов расширения IServiceCollection, которые сами регистрируют свои собственные различные типы, но также предоставляют действие, которое позволяет мне указать некоторые настройки. Мне нужно разрешить строковое значение из моего вышеупомянутого сервиса, которое я могу использовать в методе спецификации опций позже.

Этот метод расширения написан не мной, а частью сторонней библиотеки, и он сам по себе довольно обширен (например, я не хочу писать/поддерживать свою собственную версию). Само расширение выглядит следующим образом:

builder.Services.AddMySpecialService().SpecifyOptions(opt => {
  opt.Id = "<Insert DI string value here>";
});

В идеале мне нужно внедрить службу таким образом, чтобы передать это строковое значение в мои настройки, но, если не считать создания локального экземпляра (не совсем осуществимого, учитывая все его собственные зависимости), я не понимаю, как я пошел бы об этом, если это вообще возможно.

Кто-нибудь успешно сделал это, и если да, то как? Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не зная, что это за сторонняя библиотека, вы можете использовать зависимости при настройке параметров стандартным способом.

using System;

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder
    .Services
    .AddSingleton<IStringProviderService, StringProviderService>()
    .AddOptions<MyOptions>()
    // For .Configure() method you can specify up to 5 dependencies.
    .Configure<IStringProviderService>(
        (myOptions, stringProviderService) =>
        {
            myOptions.Id = stringProviderService.GetString();
        }
    );

public class MyOptions
{
    public required string Id { get; set; }
}

public interface IStringProviderService
{
    string GetString();
}

public class StringProviderService : IStringProviderService
{
    string IStringProviderService.GetString()
    {
        return Guid.NewGuid().ToString("N");
    }
}

Другие вопросы по теме