我正在为要在主机构建器中使用的 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 参数中的?
这是我创建的示例:
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
的人。