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

寻求解决依赖注入(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:10:08