MVC控制器依赖注入解析:构造函数参数与类初始化疑问
关于依赖注入的两个常见问题解答
嘿,我来帮你拆解这两个问题,搞清楚依赖注入的运作逻辑:
1. IDocumentSession的已实例化参数来自哪里?
这个实例是依赖注入(DI)容器提供的。在ASP.NET Core这类框架中,会内置一个DI容器(你也可以用第三方容器比如Autofac、Ninject),流程大概是这样:
- 首先你需要在项目的服务配置处(比如
Program.cs或者旧版的Startup.cs)注册服务映射关系,告诉容器当需要IDocumentSession接口的实例时,应该创建哪个具体实现类的对象。示例代码如下:
这里的// 在Program.cs的builder.Services中注册 builder.Services.AddScoped<IDocumentSession, DocumentSession>();AddScoped表示每个请求生命周期内创建一个实例,还有AddSingleton(全局单例)、AddTransient(每次请求都创建新实例)几种生命周期选项。 - 当框架需要创建
LeagueController实例时,会检查它的构造函数参数,发现需要IDocumentSession,就会去DI容器中查找已经注册的映射,自动创建(或者取出已存在的)对应实现类的实例,然后传入构造函数。
简单说,DI容器就像一个“对象工厂”,帮你管理所有依赖对象的创建和生命周期,你不需要手动new这些依赖。
2. 如何在构造函数中初始化另一个类?
分两种场景处理:
场景一:这个类是需要依赖注入的服务
如果这个类也是业务逻辑中的服务(比如IPlayerService),直接把它加到构造函数的参数列表里就行,DI容器会自动帮你注入实例:
public class LeagueController : BaseController { private readonly IDocumentSession _documentSession; private readonly IPlayerService _playerService; public LeagueController(IDocumentSession documentSession, IPlayerService playerService) { _documentSession = documentSession; _playerService = playerService; } }
别忘了提前在服务配置处注册IPlayerService和它的实现类:
builder.Services.AddScoped<IPlayerService, PlayerService>();
场景二:这个类是普通工具类(不需要注入)
如果是不需要DI管理的普通类(比如一个简单的LeagueCalculator工具类),可以直接在构造函数里手动new出来:
public class LeagueController : BaseController { private readonly IDocumentSession _documentSession; private readonly LeagueCalculator _calculator; public LeagueController(IDocumentSession documentSession) { _documentSession = documentSession; _calculator = new LeagueCalculator(); // 手动初始化 } }
不过要注意:如果这个普通类本身还有依赖(比如它需要IDocumentSession),那最好还是把它注册到DI容器中,通过构造函数注入,避免代码紧耦合,方便后续测试和维护。
内容的提问来源于stack exchange,提问作者BMills
相关产品推荐
相关产品推荐

