Я использую Microsoft.Extensions.DependencyInjection в своем проекте ASP.NET Core (нацеленном на .NET 7.0).
У меня есть служба, которая при наличии значительного числа внедренных других служб дает строковое значение, которое мне нужно для заполнения метода параметров во время моей регистрации DI. Как правило, я просто заставляю DI внедрять службу в любой из контроллеров, в которых я извлекаю различные необходимые значения, но здесь ситуация немного отличается.
Здесь я использую один из тех многих полезных методов расширения IServiceCollection
, которые сами регистрируют свои собственные различные типы, но также предоставляют действие, которое позволяет мне указать некоторые настройки. Мне нужно разрешить строковое значение из моего вышеупомянутого сервиса, которое я могу использовать в методе спецификации опций позже.
Этот метод расширения написан не мной, а частью сторонней библиотеки, и он сам по себе довольно обширен (например, я не хочу писать/поддерживать свою собственную версию). Само расширение выглядит следующим образом:
builder.Services.AddMySpecialService().SpecifyOptions(opt => {
opt.Id = "<Insert DI string value here>";
});
В идеале мне нужно внедрить службу таким образом, чтобы передать это строковое значение в мои настройки, но, если не считать создания локального экземпляра (не совсем осуществимого, учитывая все его собственные зависимости), я не понимаю, как я пошел бы об этом, если это вообще возможно.
Кто-нибудь успешно сделал это, и если да, то как? Спасибо!
Не зная, что это за сторонняя библиотека, вы можете использовать зависимости при настройке параметров стандартным способом.
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");
}
}