如何在 .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.cs
下ConfigureServices
方法下的文件之后,我在下面一行写了。
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<ApplicationLevelData>();
正如您在问题中所问的那样,该行可以在任何控制器中使用。但是,只要您正在制作我上面显示的课程,您就可以忽略第一行
我收到错误:方法'object System.IServiceProvider.GetService(Type) 没有类型参数以上是关于如何在 .Net Core 2.0 中创建应用程序变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET CORE Razor Pages 中创建共享表单?
如何在.net core 中创建缩略图?使用 IFormFile 的帮助
[.Net Core] - 在 .NET Core 中创建 gRPC 服务端和客户端
无法在 asp.net core EntityFrameworkCore.core 中创建迁移
如何在 Asp.NET Core WEB API 中使用 .Net (C#) 在 Payload 中创建具有自定义 JSON 声明的 JWT 令牌