【问题标题】:Most efficient way to store/retrieve static data in dotnet core/razor pages在 dotnet core/razor 页面中存储/检索静态数据的最有效方法
【发布时间】:2021-07-27 00:09:51
【问题描述】:

我需要在每个页面上显示关于我的应用的一些基本信息(使用 _Layout.cshtml)

目前我正在显示这样的应用版本:

<span>version @(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)</span>

但是,我还需要包含数据库版本和其他一些配置信息(在应用启动时从数据库中获取)。

我的问题是在哪里保存这些信息以尽可能快地生成页面最有效?我的直觉告诉我,每次获取版本的 System.Reflection 都很慢(但这可能是完全错误的)。

在应用启动时将适当的信息保存到 IConfiguration 是否有意义?在每个页面加载时从 IConfiguration 访问数据是一种有效的处理方式吗?

使用此处所述的 IMemoryCache 会更好吗? https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-5.0

在这里使用标签助手有意义吗? (https://www.learnrazorpages.com/razor-pages/tag-helpers/cache-tag-helper)

如果问题有点含糊,我们深表歉意——欢迎提出任何想法(包括告诉我我什么都不担心!)

谢谢。

【问题讨论】:

  • 至少有 n+1 个选项可以做到这一点,其中 n 是查看问题的开发人员的数量。即使是“最有效”的问题,也需要更多的信息才能得到很好的回答。什么样的基础设施?响应的 SLA 是什么?应用在给定时间段内收到多少请求?
  • @HereticMonkey - 公平点,实时应用程序的基础设施是单个网络服务器(Windows 服务器 2012)。响应没有 SLA。目前请求级别非常小。它是一个“组织内”应用程序,因此永远不会是超高流量。但是,我想编写我的应用程序,以便它尽可能地扩展。我想尽可能避免在 _Layout.cshtml 中提出昂贵的请求。不一定期望有一个“正确”的答案——只是想知道其他人会如何处理这个问题。
  • 查看help center 上的“不要问的问题种类”列表。没有正确答案的开放式“你将如何解决这个问题”并不是 Stack Overflow 的真正主题。
  • 我同意下面发布的@NoahStahl 的观点,使用依赖注入将您的数据从数据库传输到页面。而这里我要补充的是,如果需要在布局中显示的数据很小且很少更改,为什么不将它们保存在appsettings.json文件中,这个文件也可以是injected into the view

标签: asp.net-core razor


【解决方案1】:

一种选择是创建一个提供版本信息的服务类和register as a singleton。然后你可以将这个服务注入到你的布局中,根据需要获取你想要渲染的数据。

_Layout.cshtml:

@inject IMyVersionService versionService
@{
    string version = versionService.GetVersion();
}
<!DOCTYPE html>
...
<span>@version</span>

因为服务是单例的,它会在第一次访问时初始化一次,之后访问会很有效。您可以在构造函数中使用解析的版本信息设置一个私有字段。

【讨论】:

  • 感谢@Noah - 我没有意识到通过在注册服务时使用 AddSingleton,该类的构造函数只会在第一次使用时被调用一次。这似乎是一种很好的做事方式,也是通过将其作为依赖项注入的“正确”方式。
猜你喜欢
  • 2014-08-20
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多