You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从类型添加单例服务?自动注册处理类时误注册接口问题

问题分析与解决方案

你的代码确实会把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:01:03