寻求解决依赖注入(DI)膨胀问题的设计模式方案
解决方案:统一管理泛型IDisplay实例的设计方案
核心思路
通过泛型容器类封装IDisplay<T>实例的获取逻辑,结合DI框架的泛型注册能力,彻底解决Tests类中多泛型实例注入膨胀的问题,同时保持类型安全与扩展性。
具体实现步骤
1. 实现泛型Display容器类
创建DisplayProvider类,依托DI服务定位器获取对应类型的IDisplay<T>实例,对外提供简洁的类型化调用入口:
public class DisplayProvider { private readonly IServiceProvider _serviceProvider; public DisplayProvider(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public IDisplay<T> For<T>() { var display = _serviceProvider.GetService<IDisplay<T>>() ?? throw new InvalidOperationException($"未注册IDisplay<{typeof(T).Name}>实例"); return display; } }
2. DI容器批量注册泛型实现
利用DI框架的泛型注册能力,一次性完成所有IDisplay<T>与Display<T>的绑定,无需逐个类型注册:
// 注册泛型接口与实现类 services.AddScoped(typeof(IDisplay<>), typeof(Display<>)); // 注册DisplayProvider供业务类注入 services.AddScoped<DisplayProvider>();
3. Tests类中的简化调用
现在只需注入DisplayProvider一个实例,即可通过类型参数调用对应IDisplay<T>的方法:
public class Tests { private readonly DisplayProvider _displayProvider; public Tests(DisplayProvider displayProvider) { _displayProvider = displayProvider; } public void TestTreeStructure() { var root = new TreeNode(10); _displayProvider.For<TreeNode>().DisplayResult(root); } public void TestSortingResult() { var sortedArray = new int[] {1,3,5}; _displayProvider.For<int[]>().DisplayResult(sortedArray); } }
4. 树形结构实例化冗余的解决
针对树形结构的类型冗余问题,复用泛型工厂思路统一管理:
public class TreeNodeFactory { public TreeNode<T> Create<T>(T value) => new TreeNode<T>(value); }
注册后在Tests类中注入TreeNodeFactory,即可通过factory.Create(1)这类简洁调用创建不同类型的树形节点,避免重复的类型声明。
方案优势
- 零注入膨胀:无论新增多少
IDisplay<T>实现,Tests类始终只需注入DisplayProvider - 强类型安全:编译期即可检查类型匹配,避免运行时类型判断的潜在错误
- 高扩展性:新增类型的
Display<T>实现时,仅需保证DI注册逻辑,无需修改业务代码 - 符合DI原则:依赖通过容器管理,保持代码的松耦合与可测试性
内容的提问来源于stack exchange,提问作者I. Eduard
相关产品推荐
相关产品推荐

