在使用依赖注入等IoC工具时,每添加一个服务都需要在应用启动处添加一句“services.Add...”。

如果有大量同类(有相同基类/接口)的服务,为了避免这种麻烦,可以使用C#的反射功能,自动注册某些类为服务。

例如:项目中有大量的xxxValidator,且它们都实现IValidator接口,则可以用如下代码自动寻找并注册所有Validator。

//获取目标程序集(这里是当前程序集)
Assembly assembly = Assembly.GetExecutingAssembly();

//目标类型(这里是IValidator)
Type validatorType = typeof(IValidator);

//使用linq筛选出程序集中所有目标类型的实现/派生
var validators = assembly.GetTypes()
    .Where(x => !x.IsAbstract)
    .Where(validatorType.IsAssignableFrom)
    .ToList();
validators.ForEach(t =>
{
    //注册每个类(根据服务的特性选择Transient/Scoped/Singleton)
    services.AddScoped(t);
});

如果需要精准控制每个服务是Scoped还是Singleton,可以使用自定义的Attribute标注服务类,然后在循环里判断一下即可。

局限性:由于是一股脑全部获取,无法注册为 Add<Ixxx, xxx>的形式 。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐