如何在ASP.NET内核中保持对象的活动性? 我有.NET核心MVC应用程序(C++),它使用C++库(SWIG)。在C#中,我需要创建其中一个类的实例,预设其回调,并在服务器运行时使其保持活动状态。使用这个回调,我从C++获得数据。我已尝试在会话中存储对象,但只能在其中存储值: HttpContext.Session.Set(key, value);

如何在ASP.NET内核中保持对象的活动性? 我有.NET核心MVC应用程序(C++),它使用C++库(SWIG)。在C#中,我需要创建其中一个类的实例,预设其回调,并在服务器运行时使其保持活动状态。使用这个回调,我从C++获得数据。我已尝试在会话中存储对象,但只能在其中存储值: HttpContext.Session.Set(key, value);,c#,asp.net-core-mvc,signalr,C#,Asp.net Core Mvc,Signalr,还尝试在启动时定义该对象,但该对象在初始化后被释放。在这种情况下,最好的解决方案是什么 注意:在回调函数中,我使用signal发布数据。在域名称空间中的某个位置创建此对象 public static class SwiggStuff { public static SwigObject { get; } static SwiggStuff() { SwigObject = new SwigObject(); } } 现在,您可以在引用该对象所

还尝试在
启动时定义该对象,但该对象在初始化后被释放。在这种情况下,最好的解决方案是什么


注意:在回调函数中,我使用signal发布数据。

在域名称空间中的某个位置创建此对象

public static class SwiggStuff {
     public static SwigObject { get; }

     static SwiggStuff() {
          SwigObject = new SwigObject();
     }
}
现在,您可以在引用该对象所在的命名空间的任何位置访问swigobject,直到程序终止,它才会被释放

编辑(发布后一年):尽管这很有效,也很好,但在.NET核心应用程序中,这并不是一种真正可行的方法。NETCore提供了自己的方法来管理作用域实例和单例


如果您试图在.NET Core应用程序的上下文中使用单例,请查看下面的答案。

由于您使用的是ASP.NET Core,请使用内置服务管理器

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<SwiggStuff>();
}


更妙的是,让
SwiggStuff
实现
ISwiggStuff
并使用
AddSingleton()
注册它,然后使用
GetService()
获取它。当您进行单元测试时,这允许注入一个
FakeSwiggStuff

我认为您可以在mem cache()中使用。您考虑过静态字段吗?您可以创建一个返回对象的服务,并使用singleton lifecycle将其注入。检查这里@MBakardzhiev
服务。addSingleton
不起作用,作用域变量也不起作用,我已经试过了@buffjape您是指控制器中的静态字段吗?使用静态构造函数创建一个静态类。静态构造函数将仅在应用程序运行中第一次引用该类型时运行。给出返回C++数据的类静态字段/方法。出于某种原因,我试图扩展Swig类,而不是仅仅创建一个作为静态字段的实例。谢谢这可以在任何C#项目中使用,但是这个问题是针对ASP.NET核心的,它具有管理单例的功能。是的,你是对的。我也会使用.NET核心框架来实现这一点,今天我的答案会有所不同。但是,在应用程序中仍有一些地方可能不需要使用.NET核心框架,例如域层。同时也没有理由不。。。未来的读者应该使用另一个答案,而不是这个。
HttpContext.RequestServices.GetService<SwiggStuff>();