命名服务
命名服务
using System;
namespace Microsoft.Extensions.DependencyInjection
{
public static class NamedServiceExtensions
{
private delegate TService Resolver<out TService>(IServiceProvider serviceProvider, string serviceName);
public static TService GetNamedService<TService>(
this IServiceProvider provider, string serviceName)
{
return ((Resolver<TService>)provider
.GetService(typeof(Resolver<TService>)))
?.Invoke(provider, serviceName);
}
public static IServiceCollection AddNamedTransient<TService, TImplementation>(
this IServiceCollection services, string name) where TService : class where TImplementation : class, TService
{
services.AddTransient<TService, TImplementation>();
services.AddTransient(provider =>
(Resolver<TService>)((sp, sn) => sn == name ? sp.GetService<TService>() : null));
return services;
}
public static IServiceCollection AddNamedScoped<TService, TImplementation>(
this IServiceCollection services, string name) where TService : class where TImplementation : class, TService
{
services.AddScoped<TService, TImplementation>();
services.AddTransient(provider =>
(Resolver<TService>)((sp, sn) => sn == name ? sp.GetService<TService>() : null));
return services;
}
public static IServiceCollection AddNamedSingleton<TService, TImplementation>(
this IServiceCollection services, string name) where TService : class where TImplementation : class, TService
{
services.AddSingleton<TService, TImplementation>();
services.AddTransient(provider =>
(Resolver<TService>)((sp, sn) => sn == name ? sp.GetService<TService>() : null));
return services;
}
}
}
var services = new ServiceCollection();
services.AddNamedTransient<IMyService, MyService>("serviceA");
services.AddNamedScoped<IMyService, MyOtherService>("serviceB");
services.AddNamedSingleton<IMyService, MyThirdService>("serviceC");
var serviceProvider = services.BuildServiceProvider();
var serviceA = serviceProvider.GetNamedService<IMyService>("serviceA");
var serviceB = serviceProvider.GetNamedService<IMyService>("serviceB");
var serviceC = serviceProvider.GetNamedService<IMyService>("serviceC");
如果您觉得本文对你有用,不妨帮忙点个赞,或者在评论里给我一句赞美,小小成就都是今后继续为大家编写优质文章的动力,百小僧拜谢!
欢迎您持续关注我的博客:)
版权所有,欢迎保留原文链接进行转载:)