【发布时间】:2019-12-21 01:10:06
【问题描述】:
我正在使用SoapCore 为我的 ASP.NET Core MVC 应用程序创建 Web 服务。
我正在使用 Entity Framework Core 和一个简单的存储库模式来获取我的数据库数据。
我通过 .AddSingleton() 在我的 Startup.cs 中注入我的存储库类:
services.AddSingleton<IImportRepository, ImportRepository>();
services.AddSingleton<IWebService, WebService>();
由于 EF DbContext 是作用域的,因此在调用我的 Web 服务时出现错误:
无法使用范围服务“App.Data.ApplicationDbContext” 单例“App._Repository.IImportRepository”。
当我改用.AddScoped() 时,它工作正常。
我读过通过 controllers/classes 构造函数 注入作用域依赖项是不好的做法,因为它会“退回”为单例或行为类似单例。
我想知道当通过 ctor 在我的控制器中使用作用域注入时,是否有另一种方法可以使其与单例一起使用,或者从长远来看,这是否有一些主要缺点(大约 100-200 个用户将使用该站点)?
【问题讨论】:
-
通过控制器/类构造函数注入作用域依赖项是不好的做法 这不是真的。控制器也是限定范围的,并且是为您的 WebApp/Api 的每个请求创建的。所以注入你需要的东西是一个很好的做法,它会在请求后自动清理。
-
100-200 个用户就是个笑话。除非每个用户每秒执行 100-1000 个请求,否则您甚至不应该打扰。否则,做一个基准,决定。构造函数应该很快,如果你在构造函数中做了一些需要很长时间的时髦的事情,你就错了
-
“我读过通过控制器/类构造函数注入作用域依赖项是不好的做法”。请向我们提供链接和报价,以便我们检查来源。将作用域依赖注入到控制器或构造器中没有任何问题。这是很常见的事情。
-
请理解Captive Dependencies的概念。
标签: c# asp.net-core dependency-injection asp.net-core-mvc entity-framework-core