.NET Core控制台应用调用GamePlay实例是否违反DI原则?
问题解答
现有写法是否违反DI原则
你当前的写法没有完全遵循DI的核心原则:依赖抽象而非具体实现,存在两处不符合最佳实践的问题:
- 你同时注册了
IGamePlay接口和GamePlay实现类到服务容器,最后却直接从容器解析了具体的GamePlay实现类而非抽象接口,后续如果需要替换IGamePlay的实现(比如单元测试时用Mock实现替换真实业务逻辑),还需要修改Main方法里的解析逻辑,和具体实现耦合,违背了DI的解耦初衷。 - 存在多余的注册逻辑:既注册了
AddSingleton<IGamePlay,GamePlay>()又注册了AddSingleton<GamePlay>()属于重复注册,正常场景下如果只需要通过接口暴露服务,仅保留接口到实现的映射即可。
符合DI原则的最佳实践
调整逻辑如下:
- 删除多余的
GamePlay具体类注册,仅保留接口和实现的映射关系 - 从容器中解析
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
相关产品推荐
相关产品推荐

