在指定选项时将依赖注入服务解析为构建器的一部分



我在我的ASP中使用Microsoft.Extensions.DependencyInjection。.NET Core项目(目标是。NET 7.0)。

我有一个服务,它提供了大量注入的其他服务,产生了一个字符串值,我需要这个字符串值来填充在我的DI注册期间的options方法。通常,我只需要让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");
}
}

最新更新