.NET Core Service Collection 多泛型接口同一实例自动注册方案咨询
.NET Core IOC泛型接口同实例注册方案
核心逻辑
要保证IA<T>和IB<T>解析到同一个C<T>单例实例,不能直接分开注册两个接口到实现类,否则容器会生成两个独立实例,必须使用服务转发的方式,让IA<T>的解析请求直接返回已注册的IB<T>实例。
前置代码定义
// 泛型接口定义 public interface IA<T> { } public interface IB<T> : IA<T> { } // 实现类定义 public class C<T> : IB<T> { }
实现方案
方案1:手动单条注册(适合少量服务场景)
直接使用开放泛型的重载注册+工厂转发即可:
// 第一步:注册IB<T>到C<T>的单例 services.AddSingleton(typeof(IB<>), typeof(C<>)); // 第二步:添加IA<T>的转发注册,解析时直接取容器中已有的IB<T>实例 services.AddSingleton(typeof(IA<>), serviceProvider => serviceProvider.GetRequiredService(typeof(IB<>)) );
方案2:批量自动注册(适合大量泛型服务场景)
如果有多个类似的继承关系泛型接口,可通过扩展方法自动扫描生成转发注册,不需要手动逐条添加:
// 先完成所有主接口(如IB<T>)的注册 services.AddSingleton(typeof(IB<>), typeof(C<>)); // 可添加更多其他泛型服务的注册... // 通用泛型接口转发扩展方法 public static class ServiceCollectionExtensions { public static IServiceCollection AddGenericInterfaceForwarding(this IServiceCollection services) { var registeredServices = services.ToList(); foreach (var serviceDesc in registeredServices) { // 筛选开放泛型的实现类注册 if (serviceDesc.ImplementationType == null || !serviceDesc.ImplementationType.IsGenericTypeDefinition) { continue; } var implementationType = serviceDesc.ImplementationType; // 取实现类所有实现的开放泛型接口 var allGenericInterfaces = implementationType.GetInterfaces() .Where(i => i.IsGenericTypeDefinition); foreach (var interfaceType in allGenericInterfaces) { // 跳过已经显式注册过的接口 if (services.Any(s => s.ServiceType == interfaceType)) { continue; } // 添加同生命周期的转发注册 services.Add(new ServiceDescriptor( serviceType: interfaceType, factory: sp => sp.GetRequiredService(serviceDesc.ServiceType), lifetime: serviceDesc.Lifetime )); } } return services; } } // 调用扩展方法自动生成所有泛型接口的转发 services.AddGenericInterfaceForwarding();
效果验证
注册完成后可以通过以下代码验证实例一致性:
var serviceProvider = services.BuildServiceProvider(); var iaInstance = serviceProvider.GetRequiredService<IA<int>>(); var ibInstance = serviceProvider.GetRequiredService<IB<int>>(); // 输出为True,说明两个接口解析到同一个实例 Console.WriteLine(object.ReferenceEquals(iaInstance, ibInstance));
内容的提问来源于stack exchange,提问作者Thu Quoc Nguyen
相关产品推荐
相关产品推荐

