如何在 .Net Core 2.0 中创建应用程序变量?

Posted

技术标签:

【中文标题】如何在 .Net Core 2.0 中创建应用程序变量?【英文标题】:How to create Application variable in .Net Core 2.0? 【发布时间】:2018-09-29 12:51:57 【问题描述】:

我使用.Net Core 2.0 创建了网站。现在我想存储一些不是用户特定的值,我想让这些值在所有登录的用户之间共享。所以我可以使用Application Variable。但是在.Net Core 2.0 中没有内置的方法来实现这一点。

我的尝试

我创建了一个类,如下所示。

public class ApplicationLevelData
    
        public Guid TestProperty  get; set; 

        public ApplicationLevelData()
        
            TestProperty = Guid.NewGuid(); // this data will comes from database (only once)
        
    

Startup.csConfigureServices 方法下的文件之后,我在下面一行写了。

services.AddSingleton<ApplicationLevelData>();

并且在每个Controller 中,我需要如下注入该服务。

私有 ApplicationLevelData _appData;

public HomeController(ApplicationLevelData appData)

    _appData = appData;

然后我们可以在整个 Controller 中使用它。

但是,我不想要这个Inject 的东西。我们可以使用HttpContext 提供应用程序数据吗?

谁能建议我如何在.Net Core 2.0 中创建Application variable

任何帮助将不胜感激。

谢谢。

【问题讨论】:

你能解释一下为什么你不想使用依赖注入吗?我的意思是,如果你真的想要,你可以只使用单例模式 - 我不明白你为什么要在这里使用 HttpContext 你能解释一下为什么你不想使用依赖注入吗?我的意思是,如果你真的想要,你可以只使用单例模式——我不明白你为什么要在这里使用 HttpContext 只使用静态属性?既然你不想使用依赖注入,我猜使用静态属性的缺点对你来说不是问题。 @DaisyShipton 我的应用程序中有很多控制器,我需要在每个控制器中注入它。所以更好的是如果我可以直接从HttpContext 获得这些值会更好。因为HttpContext默认在所有控制器中都可用 但听起来数据与HttpContext 一点关系都没有,那么为什么要在其中包含它呢?如果您基本上想要一个单例并且不想要依赖注入的测试和隔离优势,请使用单例模式。我个人不会这样做 - 我会使用依赖注入来明确您需要它的位置,并启用简单的测试 - 但它肯定是可行的,并且比使用 HttpContext 更有意义 IMO 无关的东西到实际的要求。 【参考方案1】:
public static class Globals

    public static Guid TestProperty  get; set; 

使用(在任何地方):

var guid = Globals.TestProperty;

你说:

此数据将来自数据库(仅一次)

您也可以创建为private set,如下所示:

public static Guid TestProperty  get; private set; 

那么只能在 Globals 类中设置值,使这种类型成为只读属性。

另外,请参阅this answer 关于构造函数。 static class 有点不同。

【讨论】:

【参考方案2】:

了解不想注入背后的原因,您仍然可以使用单例并使用以下方法访问来自HttpContext 的值:

HttpContext.RequestServices.GetService<ApplicationLevelData>();

要使用此功能,您必须导入Microsoft.Extensions.DependencyInjection

如果你愿意,你也可以为此创建一个扩展函数:

public static class HttpContextExtensions 
    public static ApplicationLevelData GetAppData(this HttpContext HttpContext)
        => HttpContext.RequestServices.GetService<ApplicationLevelData>();

您现在可以使用HttpContext.GetAppData() 在任何控制器中获取您的ApplicationLevelData

【讨论】:

你能否详细解释一下我如何在我的项目中实现它。你多一点帮助会对我更有帮助。谢谢:) 我添加了更多细节。我还看到您创建了单例。你只需要创建我展示的类 你能告诉我我需要在下面写什么吗?在哪个文件中? HttpContext.RequestServices.GetService&lt;ApplicationLevelData&gt;(); 正如您在问题中所问的那样,该行可以在任何控制器中使用。但是,只要您正在制作我上面显示的课程,您就可以忽略第一行 我收到错误:方法'object System.IServiceProvider.GetService(Type) 没有类型参数

以上是关于如何在 .Net Core 2.0 中创建应用程序变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET CORE Razor Pages 中创建共享表单?

如何在.net core 中创建缩略图?使用 IFormFile 的帮助

如何在 ASP.net Core 中创建日历日期/选择器?

[.Net Core] - 在 .NET Core 中创建 gRPC 服务端和客户端

无法在 asp.net core EntityFrameworkCore.core 中创建迁移

如何在 Asp.NET Core WEB API 中使用 .Net (C#) 在 Payload 中创建具有自定义 JSON 声明的 JWT 令牌