我有一个.NET Core MVC应用程序(C#),它使用C ++库(SWIG)。在C#中,我需要创建其中一个类的实例,预设其回调并在服务器运行时保持活动状态。使用此回调,我从C ++获取数据。我试图将对象存储在会话中,但我只能在那里存储值:
HttpContext.Session.Set(key, value);
还尝试在Startup
上定义它,但该对象在初始化后处理。在这种情况下,最佳解决方案是什么?
注意:在回调函数中,我使用SignalR发布数据。
答案 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应用程序的上下文中使用单例,请查看下面的答案。