如何从类型添加单例服务?自动注册处理类时误注册接口问题
问题分析与解决方案
你的代码确实会把IEventHandler接口本身也注册成单例,因为IsAssignableFrom判断的是“当前类型(IEventHandler)是否可以被指定类型(p)赋值”——接口本身当然满足这个条件,同时如果有抽象的handler基类,也会被包含进去。要只注册实现了IEventHandler的具体handler类,需要添加过滤条件排除接口和抽象类。
修改后的代码如下:
var handlerType = typeof(IEventHandler); var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(s => s.GetTypes()) .Where(p => handlerType.IsAssignableFrom(p) && !p.IsInterface // 排除接口本身 && !p.IsAbstract); // 排除抽象类 foreach (var type in types) { serviceCollection.AddSingleton(type); }
如果你的场景需要后续通过IEventHandler接口来获取所有handler实例(比如批量调用),可以改成同时注册接口和实现类:
foreach (var type in types) { serviceCollection.AddSingleton(handlerType, type); // 同时保留自身类型的注册(如果需要直接通过handler类获取实例) serviceCollection.AddSingleton(type); }
这样既保证了每个具体handler都是单例,也能通过接口类型批量获取所有实现。
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

