如何在 ASP.NET Core 中保持对象活动?
Posted
技术标签:
【中文标题】如何在 ASP.NET Core 中保持对象活动?【英文标题】:How to keep object alive in ASP.NET Core? 【发布时间】:2018-09-05 15:40:06 【问题描述】:我有一个使用 C++ 库 (SWIG) 的 .NET Core MVC 应用程序 (C#)。在 C# 中,我需要创建其中一个类的实例,预设其回调并在服务器运行时使其保持活动状态。使用这个回调我从 C++ 中获取数据。我尝试将对象存储在会话中,但我只能在其中存储值:
HttpContext.Session.Set(key, value);
也尝试在Startup
上定义它,但对象在初始化后被释放。在这种情况下,最好的解决方案是什么?
注意:在回调函数中,我使用 SignalR 发布数据。
【问题讨论】:
我认为你可以使用 in-mem 缓存 (docs.microsoft.com/en-us/aspnet/core/performance/caching/memory) 你考虑过静态字段吗? 您可以创建一个返回对象的服务,并将其注入单例生命周期。在这里查看***.com/questions/38138100/… @MBakardzhievservices.addSingleton
不起作用,作用域变量也不起作用,我已经尝试过了。 @buffjape 你的意思是控制器中的静态字段吗?
使用静态构造函数创建一个静态类。静态构造函数只会在应用程序运行中第一次引用该类型时运行。给出返回 c++ 数据的类静态字段/方法。
【参考方案1】:
由于您使用的是 ASP.NET Core,因此请使用内置的服务管理器。
public void ConfigureServices(IServiceCollection services)
services.AddSingleton<SwiggStuff>();
要稍后获得该服务,请使用HttpContext
的RequestServices
。
HttpContext.RequestServices.GetService<SwiggStuff>();
更好的是,让SwiggStuff
实现ISwiggStuff
并使用AddSingleton<ISwiggStuff, SwiggStuff>()
注册它,然后使用GetService<ISwiggStuff>()
获取它。这允许在您进行单元测试时注入FakeSwiggStuff
。
【讨论】:
【参考方案2】:在域命名空间的某处创建此对象。
public static class SwiggStuff
public static SwigObject get;
static SwiggStuff()
SwigObject = new SwigObject();
现在你可以在任何你引用这个对象所在的命名空间的地方访问 swigobject,在程序终止之前它不会被释放。
编辑(发布后一年):尽管这可以工作并且非常好,但这并不是 .NET Core 应用程序的真正方式。 NET Core 提供了自己的方式来管理作用域实例和单例。
如果您尝试在 .NET Core 应用程序的上下文中使用单例,请查看下面的答案。
【讨论】:
没错!出于某种原因,我试图扩展 Swig 类,而不是仅仅将它的实例创建为静态字段。谢谢! 这可以在任何 C# 项目中使用,但是这个问题是针对具有 its own way 管理单例的 ASP.NET Core 的。 是的,你是对的。我也会为此使用 .NET Core 框架,而我今天的答案会有所不同。但是,您的应用程序中仍有一些地方可能不需要使用 .NET Core Framework,例如域层。同时,没有真正的理由不......未来的读者应该使用另一个答案,而不是这个。以上是关于如何在 ASP.NET Core 中保持对象活动?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core Web API 中发布对象列表
如何对 ASP.NET Core 控制器或模型对象进行单元测试?
asp.net core定时任务保持存活,不会被回收。asp.net core回收事件