我使用.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
吗?
任何帮助都将受到高度赞赏。
感谢。
答案 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
上有点不同。