依赖注入核心组件
在.NET Core中DI的核心分为两个组件:IServiceCollection和 IServiceProvider。
IServiceCollection 负责注册
IServiceProvider 负责提供实例
通过IServiceCollection注册进去有三个方法:AddSingleton,AddTransient,AddScoped
这三个方法只是生命周期不同:
Transient: 每一次GetService都会创建一个新的实例
Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
Singleton :整个应用程序生命周期以内只创建一个实例
这有什么用?
如果在Mvc中用过Autofac的InstancePerRequest的同学就知道,有一些对象在一个请求跨越多个Action或者多个Service、
Repository的时候,比如最常用的DBContext它可以是一个实例。即能减少实例初始化的消耗,还能实现
跨Service事务的功能。(注:在ASP.NET Core中所有用到EF的Service 都需要注册成Scoped )
而实现这种功能的方法就是在整个reqeust请求的生命周期以内共用了一个Scope。
如何使用?
在Controller中使用依赖注入
一般可以通过构造函数或者属性来实现注入,但是官方推荐是通过构造函数。这也是所谓的显式依赖。
首先我们在ConfigureServices方法中注册接口和实现类:
services.AddTransient(typeof(IFormula),typeof(MainFormula));
然后在Controller中的构造函数中取出这个对象,就能使用它了
public IFormula _formula = null;
public HomeController(IFormula formula)
{
_formula = formula;
}
在View中需要用@inject声明一下:
@inject IFormula _formula
<div>@_formula.ID</div>