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 发布数据。
由于您使用的是 ASP.NET Core,因此请使用内置的服务管理器。
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<SwiggStuff>();
}
Run Code Online (Sandbox Code Playgroud)
要稍后获得该服务,请使用RequestServices的HttpContext。
HttpContext.RequestServices.GetService<SwiggStuff>();
Run Code Online (Sandbox Code Playgroud)
更好的是,制作SwiggStuff实现ISwiggStuff并使用注册它AddSingleton<ISwiggStuff, SwiggStuff>(),然后使用 获取它GetService<ISwiggStuff>()。FakeSwiggStuff这允许在进行单元测试时注入 a 。
在域命名空间中的某个位置创建此对象。
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 应用程序上下文中使用单例,请查看下面的答案。