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

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中,我需要注入该服务,如下所示: private ApplicationLevelData _appData;
public HomeController(ApplicationLevelData appData)
{
    _appData = appData;
}

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

但是,我不想用这个Inject。我们能否使用HttpContext使应用程序数据可用?

有人能建议我如何在.Net Core 2.0中创建Application变量吗?

任何帮助将不胜感激。

谢谢。


1
你能解释一下为什么你不想使用依赖注入吗?我的意思是,如果你真的想要,你可以只使用单例模式 - 我不明白为什么你想在这里使用 HttpContext。 - Jon Skeet
你能解释一下为什么你不想使用依赖注入吗?我的意思是,如果你真的想要,你可以使用单例模式 - 我不明白为什么你想在这里使用 HttpContext - Jon Skeet
那就直接使用静态属性吧?既然你不想使用依赖注入,使用静态属性的缺点对你来说应该不是问题。 - Evk
@DaisyShipton 我的应用程序中有许多控制器,我需要在每个控制器中注入它。所以最好的方法是如果我可以直接从 HttpContext 中获取这些值。因为 HttpContext 在所有控制器中都是默认可用的。 - prog1011
2
但是听起来数据与HttpContext毫无关系,为什么要将其包含在其中?如果您基本上想要一个单例,并且不想要依赖注入的测试和隔离优势,请使用单例模式。我个人不会这样做 - 我会使用依赖注入来清楚地指出您需要它的位置,并启用轻松的测试 - 但这肯定是可行的,并且在我看来比使用HttpContext处理与实际请求无关的内容更有意义。 - Jon Skeet
显示剩余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>();
}

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

请详细解释一下如何在我的项目中实现它。您再多的帮助对我都会更有帮助。谢谢 :) - prog1011
我已经添加了一些更多的细节。我也看到你已经创建了单例模式。你只需要创建我展示的那个类即可。 - Neville Nazerane
请问我需要在哪个文件中编写以下代码行? HttpContext.RequestServices.GetService<ApplicationLevelData>(); - prog1011
那行代码可以在任何控制器中使用,就像你在问题中所问的那样。然而,只要你创建了我上面展示的类,你就可以忽略那第一行代码。 - Neville Nazerane
我遇到了一个错误:方法 'object System.IServiceProvider.GetService(Type) 没有类型参数。 - prog1011
你需要在文件开头添加 using Microsoft.Extensions.DependencyInjection - Neville Nazerane

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内部才能设置该值,使其成为只读属性。

此外,请参见此答案关于构造函数的说明。在静态类中有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接