我正在使用Autofac和Entity Framework开发ASP.net Web API应用程序。
我一直在将我的服务类划分成较小的类,以使我的代码更具可测试性,并使我的代码更可靠。
我正在使用Autofac将Entity Framework DbContext注入我的各种帮助程序类中。这变得有问题,因为如果我在两个不同的帮助器类中使用从DbContext查询的实体,则当Entity Framework尝试生成查询时会出现错误。
该错误表明Entity Framework无法使用来自DbContext的两个不同实例的实体进行查询。
很明显,解决方案是我需要配置Autofac,以便将相同的DbContext实例注入到每个帮助器类中,但是如果这样做,恐怕我可能会遇到并发问题该应用程序已部署到生产环境中,许多人一次使用它。
如何配置Autofac,以便当请求到达我的应用程序时,我的API帮助器类都获得相同的DbContext实例,但是在多个请求中没有并发问题?
答案 0 :(得分:0)
Autofac文档(https://autofaccn.readthedocs.io/en/latest/faq/per-request-scope.html#no-per-request-filter-dependencies-in-web-api)建议的操作过滤器的替代方法,请参见:“ Web API中没有每个请求的过滤器依赖性”,并手动转到DependencyResolver:
您可以查看Medhime DbContextScope工作提供者单元。 (https://www.nuget.org/packages/EntityFramework.DbContextScope/)为EF6和EF Core编译。
为您的类注入的依赖项将成为顶级的DbContextScopeFactory和服务的AmbientDbContextLocator。这些不会“破坏” Web API对请求生存期范围的限制。 ContextScopeFactory将被初始化一次并提供DbContext,而定位器将被馈入该单个实例。
值得一提的是,如果跨服务管理上下文引用和API操作显得笨拙。