3

我已经使用.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

任何帮助将不胜感激。

谢谢。

4

2 回答 2

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().

于 2018-04-19T08:07:39.510 回答
0
public static class Globals
{
    public static Guid TestProperty { get; set; }
}

用法(在任何地方):

var guid = Globals.TestProperty;

你说:

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

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

public static Guid TestProperty { get; private set; }

然后只能在 class 内设置值Globals,使这种只读属性。

另外,请参阅有关构造函数的答案。在 a 上有点不同static class

于 2018-04-19T06:51:02.807 回答