如何在.Net Core 2.0中创建Application变量?

时间:2018-04-19 06:15:46

标签: c# asp.net-core-2.0 .net-core-2.0 application-variables

我使用.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.cs文件下的ConfigureServices文件下,我写了下面的行。

services.AddSingleton<ApplicationLevelData>();

在每个Controller我需要注入该服务,如下所示。

私有ApplicationLevelData _appData;

public HomeController(ApplicationLevelData appData)
{
    _appData = appData;
}

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

但是,我不想要Inject这件事。我们可以使用HttpContext生成应用程序数据吗?

有人可以建议我如何在Application variable中创建.Net Core 2.0吗?

任何帮助都将受到高度赞赏。

感谢。

2 个答案:

答案 0 :(得分:1)

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

HttpContext.RequestServices.GetService<ApplicationLevelData>();

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

如果您愿意,也可以为此创建扩展功能:

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

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

答案 1 :(得分:0)

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上有点不同。