110 Service Scope(Child Scope, 手动创建Scope)

示例

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获取源码:

https://gitee.com/huang_jianhua0101/asp.-net-core-8.git

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄健华Yeah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值