如何在 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/… @MBakardzhiev services.addSingleton 不起作用,作用域变量也不起作用,我已经尝试过了。 @buffjape 你的意思是控制器中的静态字段吗? 使用静态构造函数创建一个静态类。静态构造函数只会在应用程序运行中第一次引用该类型时运行。给出返回 c++ 数据的类静态字段/方法。 【参考方案1】:

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

public void ConfigureServices(IServiceCollection services)

    services.AddSingleton<SwiggStuff>();

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

HttpContext.RequestServices.GetService<SwiggStuff>();

更好的是,让SwiggStuff 实现ISwiggStuff 并使用AddSingleton&lt;ISwiggStuff, SwiggStuff&gt;() 注册它,然后使用GetService&lt;ISwiggStuff&gt;() 获取它。这允许在您进行单元测试时注入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 Identity 系列之五

如何在 ASP.NET Core Web API 中发布对象列表

如何对 ASP.NET Core 控制器或模型对象进行单元测试?

asp.net core定时任务保持存活,不会被回收。asp.net core回收事件

在 Ajax 调用期间保持 ASP.Net 会话处于活动状态

在 ASP.NET Core Razor 页面中使用 JavaScript 更改活动导航栏链接