如何在我的扩展方法中获取正确的 IServiceProvider 实例

问题描述 投票:0回答:1

我正在为要在主机构建器中使用的 api 编写扩展方法,并且我需要在其中获取 IServiceProvider 的实例。

我看到了

builder.Services.AddDbContext<T>()

有一个参数

(IServiceProvider,DbContextOptionsBuilder)

,所以我想将其添加到我的扩展方法中,但是如何?

假设我有这个扩展方法:

public static class MyExtensions
{
    public static IServiceCollection AddMyServices(this IServiceCollection services, Action<IServiceProvider, MyServicesOptionBuilder> overrides)
    {
        ...
        return services;
    }
}

预期的用法是这样的:


var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMyServices((serviceProvider, config)=>
{
    var serviceconfiguration = serviceProvider.GetRequiredService<SomeServiceConfiguration>();
    cfg.ConfigureService1(serviceconfiguration);
    cfg.ConfigureService2(serviceconfiguration);

    ....
});

我不明白的是,IServiceProvider 是谁或者如何传入到 Action 参数中的?

c# dependency-injection extension-methods .net-8.0
1个回答
0
投票

这是我创建的示例:

public static class MyExtensions
{
    public static void AddMyServices(this IServiceCollection services, Action<IServiceProvider, MyServicesOptionBuilder> overrides)
    {
        // get IServiceProvider from IServiceCollection
        IServiceProvider serviceProvider = services.BuildServiceProvider();

        // create MyServicesOptionBuilder instance
        var options = new MyServicesOptionBuilder();

        // Let the client set option's value
        overrides.Invoke(serviceProvider, options);

        // create MyDependency instance using the option value that was set by the client
        var dependency = new MyDependency(options.DependencyName);

        services.AddKeyedSingleton("Second", dependency);

        serviceProvider.GetKeyedServices<MyDependency>("Second");

        Debug.Assert(dependency.DependencyName == "This is a different dependency");
        Console.WriteLine(dependency.DependencyName);
    }
}

程序.cs:

// Add services to the container.
builder.Services.AddKeyedSingleton("First" ,new MyDependency("This is a dependency"));

builder.Services.AddMyServices((services, options) =>
{
    var firstDependency = services.GetRequiredKeyedService<MyDependency>("First");

    Debug.Assert(firstDependency.DependencyName == "This is a dependency");
    Console.WriteLine(firstDependency.DependencyName);

    options.DependencyName = "This is a different dependency";
});

我不明白的是,IServiceProvider 是谁或者如何传入到 Action 参数中的?

如您所见,您是创造

IServiceProvider
的人。

© www.soinside.com 2019 - 2024. All rights reserved.