示例
HomeController.cs中添加
private readonly IServiceScopeFactory _serviceScopeFactory;
并添加到构造函数中,然后使用CreateScope()方法创建Scope
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ViewComponents;
using ServiceContracts;
using Services;
namespace DIExample.Controllers
{
public class HomeController : Controller
{
//private readonly CitiesService _citiesService;
private readonly ICitiesService _citiesService1;
private readonly ICitiesService _citiesService2;
private readonly ICitiesService _citiesService3;
private readonly IServiceScopeFactory _serviceScopeFactory;
public HomeController(ICitiesService services1,
ICitiesService services2,
ICitiesService services3,
IServiceScopeFactory serviceScopeFactory)
{
//_citiesService = new CitiesService();
_citiesService1 = services1;
_citiesService2 = services2;
_citiesService3 = services3;
_serviceScopeFactory = serviceScopeFactory;
}
[Route("/")]
public IActionResult Index()
{
List<string> cities = _citiesService1.GetCities();
ViewBag.Ins1 = _citiesService1.ServiceInstanceId;
ViewBag.Ins2 = _citiesService2.ServiceInstanceId;
ViewBag.Ins3 = _citiesService3.ServiceInstanceId;
using(IServiceScope scope = _serviceScopeFactory.CreateScope())
{
//Inject CitiesService
ICitiesService citiesService = scope.ServiceProvider.GetRequiredService<ICitiesService>();
//DB work
ViewBag.Ins4 = citiesService.ServiceInstanceId;
} //end of scope; it calls CitiesService.Dispose()
return View(cities);
}
}
}
Index.cshtml
@model IEnumerable<string>
@{
ViewBag.Title = "Home";
}
<h1>Home</h1>
<ul class="list">
@foreach (string city in Model)
{
<li>@city</li>
}
</ul>
<div>Ins1: @ViewBag.Ins1</div>
<div>Ins2: @ViewBag.Ins2</div>
<div>Ins3: @ViewBag.Ins3</div>
<div>Ins4: @ViewBag.Ins4</div>
CitiesService.cs中添加IDisposable接口,实现Dispose()函数
using ServiceContracts;
namespace Services
{
public class CitiesService : ICitiesService, IDisposable
{
private List<string> _cities;
private Guid _serviceInstanceId;
public Guid ServiceInstanceId
{
get
{
return _serviceInstanceId;
}
}
public CitiesService()
{
_serviceInstanceId = Guid.NewGuid();
_cities = new List<string>()
{
"Lodon",
"Paris",
"New York",
"Tokyo",
"Rome"
};
//TO DO: Add logic to open the db connection
}
public List<string> GetCities()
{
return _cities;
}
public void Dispose()
{
//TO DO: add logic to close db connection
}
}
}
Program.cs改为Scoped
using ServiceContracts;
using Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.Add(new ServiceDescriptor(
typeof(ICitiesService),
typeof(CitiesService),
ServiceLifetime.Scoped));
//builder.Services.AddScoped<ICitiesService, CitiesService>();
var app = builder.Build();
//app.MapGet("/", () => "Hello World!");
app.UseStaticFiles();
app.UseRouting();
app.MapControllers();
app.Run();
注意
EF Core实例由EF Core自己管理,不需要手动创建Scope。
Gitee获取源码: