首页 新闻 会员 周边

关于EF Core以及aspnet core的一些问题

0
悬赏园豆:50 [待解决问题]

1.asp.net core mvc项目中 配置ef的问题,我这样写的话 ef上下文对象是线程内唯一吗?

之前在asp.net 中 我是通过callcontext来实现线程内唯一的, 这里是官方给的文档中这样写的 不知道是不是线程内唯一,? ps:这是在startup.cs中写的

services.AddDbContext<MyDataContext>(options => options.UseSqlServer(connection)); 

2. DI 配置的时候 AddTransient()与 AddScoped()我该选哪个?,

在我理解下 AddScoped 是线程内创建一个。 下一次用到的时候 就不会创建了,AddTransient
是每次获取都会创建一个,, 不知道对不对, 然后如果我创建业务层的实例的话 是否应该用
AddScoped

3. 关于控制器中Action的问题

这是我在github上研究别人的asp.net core项目的时候产生的疑惑,他这边是一个异步action
大概就是获取数据

        [Route("/{page:int?}")]
        [OutputCache(Profile = "default")]
        public async Task<IActionResult> Index([FromRoute]int page = 0)
        {
            var posts = await _blog.GetPosts(_settings.Value.PostsPerPage, _settings.Value.PostsPerPage * page);
            ViewData["Title"] = _manifest.Name;
            ViewData["Description"] = _manifest.Description;
            ViewData["prev"] = $"/{page + 1}/";
            ViewData["next"] = $"/{(page <= 1 ? null : page - 1 + "/")}";
            return View("~/Views/Blog/Index.cshtml", posts);
        }

我疑惑的是 var posts = await _blog.GetPosts(_settings.Value.PostsPerPage, _settings.Value.PostsPerPage * page); 它这里使用了 await, 导致程序会等,
这句话执行完成后 才会 return view,
那么 它这里使用同步方法 不就可以了么 ,为什么还异步呢?

最后祝大家国庆快乐 ,非常感激 您看我了我的问题,小菜鸟实在不懂 希望大佬们指点一二

AliceBaby的主页 AliceBaby | 初学一级 | 园豆:184
提问于:2018-10-05 10:49
< >
分享
所有回答(1)
0
  1. services.AddDbContext 有个 contextLifetime 参数,默认值是 ServiceLifetime.Scoped ,所以注册的 DbContext 默认是同一个请求内唯一(注:是同一个请求,不是同一个线程,使用异步时会发生线程切换,同一个请求会在多个线程中执行)
  2. 优先使用 AddTransient ,除非在同一个请求中对应的实例会被其他类的实例共享
  3. await 会释放当前线程,等异步执行完成时从线程池中重新拿到一个线程继续执行,避免了当前线程的空等,提高了线程的利用率
dudu | 园豆:30994 (高人七级) | 2018-10-05 14:46

666

支持(1) 反对(0) 心雨纷扬 | 园豆:309 (菜鸟二级) | 2018-10-29 17:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册