咨询:这种适配DryIoc DI容器的接口继承模式名称是什么?
你的泛型接口依赖注入模式官方名称解析
你设计的这套方案核心是自引用泛型接口(Self-Referencing Generic Interface),结合了泛型协变与标记接口的特性,在依赖注入场景中,常被用来实现类型化服务分组与多特征筛选。
核心术语说明
- 自引用泛型接口:这是最核心的特征——实现类继承以自身为类型参数的泛型接口(比如
Coffee : IBeverage<Coffee>),这种设计让类型本身成为接口的"标记",同时为协变筛选提供基础。 - 泛型协变:接口使用
out T修饰符,允许你通过父类型(如ICaffeine)来筛选实现了该特征的子类型服务,这也是你能解析IEnumerable<IBeverage<ICaffeine>>的关键。 - 标记接口:非泛型的
IBeverage、ICaffeine作为基础标记,用于批量获取所有对应类型的服务实例。
补充说明
在DI容器生态(包括DryIoc)中,这种组合模式没有单一的"官方统一名称",但也有开发者根据其用途称其为协变服务标记模式或多维度服务注册模式,不过最通用的检索关键词还是自引用泛型接口,以此查找相关资料会更精准。
这种模式恰好解决了你原Registry方案的弊端:
- 无需关注类的注册位置:DI容器可通过扫描实现特定接口的类型自动完成注册;
- 接口本身就是语义化文档:
IBeverage、ICaffeine的用途清晰,无需额外文档说明; - 避免重复注册与依赖冗余:每个实现类仅需实现对应接口,容器按接口类型自动分组管理,不会出现冗余依赖问题。
你的方案代码回顾
泛型接口定义
interface IBeverage { } interface IBeverage<out T> : IBeverage { } interface ICaffeine { } interface ICaffeine<out T> : ICaffeine { }
实现类示例
class Coffee : IBeverage<Coffee>, ICaffeine<Coffee> { } class EnergyDrink : IBeverage<EnergyDrink>, ICaffeine<EnergyDrink> { } class Water : IBeverage<Water> { } class CaffeineTablet : ICaffeine<CaffeineTablet> { }
DI解析示例
var allBeverages = container.Resolve<IEnumerable<IBeverage>>(); var allCaffeine = container.Resolve<IEnumerable<ICaffeine>>(); var allBeveragesWithCaffeine = container.Resolve<IEnumerable<IBeverage<ICaffeine>>>();
内容的提问来源于stack exchange,提问作者Mitja
相关产品推荐
相关产品推荐

