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

.NET Core控制台应用调用GamePlay实例是否违反DI原则?

问题解答

现有写法是否违反DI原则

你当前的写法没有完全遵循DI的核心原则:依赖抽象而非具体实现,存在两处不符合最佳实践的问题:

  • 你同时注册了IGamePlay接口和GamePlay实现类到服务容器,最后却直接从容器解析了具体的GamePlay实现类而非抽象接口,后续如果需要替换IGamePlay的实现(比如单元测试时用Mock实现替换真实业务逻辑),还需要修改Main方法里的解析逻辑,和具体实现耦合,违背了DI的解耦初衷。
  • 存在多余的注册逻辑:既注册了AddSingleton<IGamePlay,GamePlay>()又注册了AddSingleton<GamePlay>()属于重复注册,正常场景下如果只需要通过接口暴露服务,仅保留接口到实现的映射即可。

符合DI原则的最佳实践

调整逻辑如下:

  1. 删除多余的GamePlay具体类注册,仅保留接口和实现的映射关系
  2. 从容器中解析IGamePlay接口实例而非具体实现类实例

修改后的代码如下:

class Program
{
    static void Main(string[] args)
    {
        var serviceProvider = new ServiceCollection()               
               .AddSingleton<IGamePlay,GamePlay>()                
               .BuildServiceProvider();

        // 填充玩家列表逻辑
        // 解析抽象接口而非具体实现
        var gamePlay = serviceProvider.GetRequiredService<IGamePlay>();

        gamePlay.StartPlay(listOfPlayers,deckSize);
    }
}

如果你的GamePlay类存在没有定义在IGamePlay接口中的独有方法需要调用,可先评估接口设计是否合理,确实需要保留独有方法的场景下才需要保留具体类的注册,否则优先走接口解析的方式。

内容的提问来源于stack exchange,提问作者VA1267

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:36:02