Angular 在控制器上分配持久对象';在ASP.NET核心中使用DI的构造函数

Angular 在控制器上分配持久对象';在ASP.NET核心中使用DI的构造函数,angular,asp.net-core-mvc,object-persistence,Angular,Asp.net Core Mvc,Object Persistence,所以也许有几种方式来表达这个问题,但这已经足够清楚了。我有一个与我的web项目(基于Angular2和Asp.Net Core构建)分开的常规类库,我必须在整个web应用程序生命周期中保持其“核心对象”状态。我的问题是,此类对象的类访问数据库,我必须使用DI才能从Angular2应用程序访问正确的DBContext private Building building = null; public AddDoorController(AutoListDbContext context) {

所以也许有几种方式来表达这个问题,但这已经足够清楚了。我有一个与我的web项目(基于Angular2和Asp.Net Core构建)分开的常规类库,我必须在整个web应用程序生命周期中保持其“核心对象”状态。我的问题是,此类对象的类访问数据库,我必须使用DI才能从Angular2应用程序访问正确的DBContext

private Building building = null;
public AddDoorController(AutoListDbContext context) {
    building = new Building(context);
}
但是,我必须持久化
构建
状态,但是从我目前收集的数据来看,用于促进状态持久化的服务器端类(例如
HttpContext
TempData
等等)在构造函数的范围内不可用。我希望将此数据保留在服务器端,肯定有办法解决,不是吗?

EF上下文是(并且应该是)请求范围。这意味着您只能将它们注入到具有请求/临时作用域的其他对象中。由于上下文在应用程序的生命周期中被多次创建和销毁,因此不能将其注入到单例范围的对象中,该对象将只创建一次

如果您有一个必须访问上下文的单例,则可以插入
IServiceCollection
并使用服务定位器模式,即:

var context = services.GetService<MyContext>();
var context=services.GetService();
但是,每次访问上下文时都需要执行该操作。换句话说,不要将其保存到实例变量或字段中,因为它将在某个时刻被释放。一般来说,应该避免使用服务定位器模式,因为它可能导致各种问题,但有时您没有选择

尽管如此,你很可能并不需要单身。像
HttpContext
这样的东西在ASP.NET核心中不再是静态的。如果需要访问
HttpContext
,只需插入
IHttpContextAccessor
。顾名思义,它允许您访问当前的
HttpContext
实例

此外,请求之间需要持久化的状态应该持久化,即实际保存到某种持久化存储中,如SQL Server或Redis。在这方面,您可以设置一个缓存,然后使用它来持久化您的对象状态,因为分布式缓存(在配置时)将使用SQL Server或Redis作为备份。这还可以避免单例作用域,因为只要需要,就可以随时从分布式缓存中检索对象