如何在 ASP.NET Core 中保持对象存活?

I.M*_*nev 5 c# signalr asp.net-core-mvc

我有一个 .NET Core MVC 应用程序 (C#),它使用 C++ 库 (SWIG)。在 C# 中,我需要创建其中一个类的实例,预设其回调并在服务器运行时保持其活动状态。使用此回调我从 C++ 获取数据。我尝试将对象存储在会话中,但我只能在那里存储值:

HttpContext.Session.Set(key, value);
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*der 5

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

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<SwiggStuff>();
}
Run Code Online (Sandbox Code Playgroud)

要稍后获得该服务,请使用RequestServicesHttpContext

HttpContext.RequestServices.GetService<SwiggStuff>();
Run Code Online (Sandbox Code Playgroud)

更好的是,制作SwiggStuff实现ISwiggStuff并使用注册它AddSingleton<ISwiggStuff, SwiggStuff>(),然后使用 获取它GetService<ISwiggStuff>()FakeSwiggStuff这允许在进行单元测试时注入 a 。


Glu*_*bus 0

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

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

     static SwiggStuff() {
          SwigObject = new SwigObject();
     }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在引用该对象所在的命名空间的任何地方访问 swigobject,直到程序终止为止它不会被释放。

编辑(发布一年后):尽管这可以工作并且非常好,但它并不是真正的 .NET Core 应用程序中的方法。NET Core 提供了自己的方式来管理作用域实例和单例。

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