如何使用内置IOC容器ServiceCollection
注:DI依赖注入:lServiceCollection 仅支持 构造函数注入(方法和属性注入 可以使用 Autofac )
第一种方式:
1、在Startup中的ConfigureServices方法中注册服务
//1、最常用的注入方式,以接口形式暴露服务。
services.AddScoped<ITestService, TestService>();
//services.AddScoped(typeof(ITestService), typeof(TestService));//方式2
//2、自己注入自己,以实现形式暴露服务
services.AddScoped<AService>();
//3、构造函数 有参数 的注入
//services.AddScoped<ITestService>(sp => { return new TestService("my_TestService"); });
2、在需要使用的控制器中,通过构造函数,定义服务的抽象类型,作为参数,在运行时,自动得到服务的具体;
private readonly ITestService _ITestService;
private readonly AService _AService;
public HomeController(ITestService testService, AService aService)
{
_ITestService = testService;
_AService = aService;
}
3、调用服务内部的方法
public IActionResult Index()
{
var name1 = _ITestService.GetServiceName();
var name2 = _AService.GetServiceName();
return View();
}
第二种方式:
1、在Startup中的ConfigureServices方法中注册服务
services.AddScoped<ITestService, TestService>();
services.AddScoped<AService>();
2、在需要使用的控制器中,通过构造画数,注入lServiceProvider
private readonly IServiceProvider _ServiceProvider;
public HomeController(IServiceProvider serviceProvider)
{
_ServiceProvider = serviceProvider;
}
3、通过 _ServiceProvider 获取到服务,然后通过服务实例调用服务内部的方法
public IActionResult Index()
{
ITestService _TestService = _ServiceProvider.GetService<ITestService>();
var name1 = _TestService.GetServiceName();
AService _AService = (AService)_ServiceProvider.GetService(typeof(AService));
var name2 = _AService.GetServiceName();
return View();
}
第三种方式
在注册服务后,视图中通过关键字 @inject 获取实例
@inject ITestService _TestService;
@inject AService _AService;
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<p>
_TestService的名称= @_TestService.GetServiceName()
</p>
<p>
_AService的名称= @_AService.GetServiceName()
</p>
</div>