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

时间:2018-03-27 09:36:31

标签: c# asp.net-core-mvc signalr

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

HttpContext.Session.Set(key, value);

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

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

2 个答案:

答案 0 :(得分:3)

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

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

要稍后获得该服务,请使用RequestServices中的HttpContext

HttpContext.RequestServices.GetService<SwiggStuff>();

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

答案 1 :(得分:0)

在域名称空间中的某处创建此对象。

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

     static SwiggStuff() {
          SwigObject = new SwigObject();
     }
}

现在,您可以在引用此对象所在的命名空间的任何位置访问swigobject,它将不会被处理,直到程序终止。

编辑(发布后的第一年):即使这样做并且非常好,但它并不是真正的.NET核心应用程序。 NET Core提供了自己的方式来管理范围实例和单例。

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