在 Blazor 服务器端,您可以在静态上下文中获取电路特定状态而不传递它吗?
In Blazor serverside can you get hold of circuit specific state in a static context without passing it in?
好的,这是一个相当具体的问题,需要额外的解释和上下文。
上下文
我们正在 POCing 从定制语言到 .net 核心(目前 5 个)和 Blazor 服务器的“尝试转换”。服务器,因为它允许使用 try-convert 脚手架,我们可以解决安全问题。细节并不重要。它只是解释了为什么我们有一些在正常情况下看起来不切实际的限制。
我完全接受“不,你不能”甚至“不,你不应该”是可能的结果。我们正在探索可能性。
问题
blazor 中电路的概念非常适合表示层。我们希望在电路范围内存储信息。
显而易见的解决方案是在依赖项注入容器中使用作用域服务。
例如在我的 Startup.cs 我可以放
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddScoped<IStaticStore, ClientStaticStorage>();
}
这允许我存储信息,这些信息在我的原始(预转换)应用程序中是静态范围到桌面的,但在 blazor 服务器端是一个假的“静态”存储范围到电路。 IStaticStore 和 ClientStaticStorage 只是 类 我创建的 - 我可以访问的数据字典。
症结
我们可以在静态方法(或属性)中访问电路范围数据而不传入它吗?
如果我在 razor 组件中,我们可以将其 @inject 并从实例化上下文中访问它
但显然从静态访问将使编译器抱怨需要对象引用
@inject IStaticStore StaticStore
@code {
static void DoSomeThing()
{
var thingy = StaticStore.InternalGetStatic<Thing>("foo", "bar");
}
}
实际上我不想从剃须刀组件访问 - 显然这里的答案是传递商店。我正在访问堆栈中的 c# 代码,并从 20 年的增长功能中转换过来(因此我遇到了一个复杂的奇怪情况)。
所以 - 我可以在这里访问 StaticStore,从电路范围以一种非常简单的静态友好辅助方式,而不将其传递到静态方法中。
我能想到的最接近的示例是您过去如何能够访问 HttpContext.Current(pre .net core)并且它神奇地为您提供了作用域的 httpcontext。有没有类似的电路?
据我对你的问题和 Blazor 概念的理解,你的问题的答案是“否”。不可能在 Blazor 中静态检索当前的 HTTP 上下文。因为您永远不知道上下文是初始页面加载还是只是用于更新当前页面的 SignalR 通信。
这是我保存这种情况的方式:
创建所有剃须刀组件共享的级联参数
这个级联参数是一个class,有很多信息来自
初始 HTTP 请求,在 _Host.cshtml 来自
httpContextAccessor.HttpContext
这个级联参数class获取了我之前的所有方法
静态方法。
这些方法可以使用级联参数的属性:
RawUrl、UserAgent、ClientIp、...
这意味着要进行艰苦的重构工作以迁移遗留 ASP 网站。但是 Blazor 的表演是值得的。
好的,这是一个相当具体的问题,需要额外的解释和上下文。
上下文
我们正在 POCing 从定制语言到 .net 核心(目前 5 个)和 Blazor 服务器的“尝试转换”。服务器,因为它允许使用 try-convert 脚手架,我们可以解决安全问题。细节并不重要。它只是解释了为什么我们有一些在正常情况下看起来不切实际的限制。
我完全接受“不,你不能”甚至“不,你不应该”是可能的结果。我们正在探索可能性。
问题
blazor 中电路的概念非常适合表示层。我们希望在电路范围内存储信息。
显而易见的解决方案是在依赖项注入容器中使用作用域服务。
例如在我的 Startup.cs 我可以放
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddScoped<IStaticStore, ClientStaticStorage>();
}
这允许我存储信息,这些信息在我的原始(预转换)应用程序中是静态范围到桌面的,但在 blazor 服务器端是一个假的“静态”存储范围到电路。 IStaticStore 和 ClientStaticStorage 只是 类 我创建的 - 我可以访问的数据字典。
症结
我们可以在静态方法(或属性)中访问电路范围数据而不传入它吗?
如果我在 razor 组件中,我们可以将其 @inject 并从实例化上下文中访问它
但显然从静态访问将使编译器抱怨需要对象引用
@inject IStaticStore StaticStore
@code {
static void DoSomeThing()
{
var thingy = StaticStore.InternalGetStatic<Thing>("foo", "bar");
}
}
实际上我不想从剃须刀组件访问 - 显然这里的答案是传递商店。我正在访问堆栈中的 c# 代码,并从 20 年的增长功能中转换过来(因此我遇到了一个复杂的奇怪情况)。
所以 - 我可以在这里访问 StaticStore,从电路范围以一种非常简单的静态友好辅助方式,而不将其传递到静态方法中。
我能想到的最接近的示例是您过去如何能够访问 HttpContext.Current(pre .net core)并且它神奇地为您提供了作用域的 httpcontext。有没有类似的电路?
据我对你的问题和 Blazor 概念的理解,你的问题的答案是“否”。不可能在 Blazor 中静态检索当前的 HTTP 上下文。因为您永远不知道上下文是初始页面加载还是只是用于更新当前页面的 SignalR 通信。 这是我保存这种情况的方式:
创建所有剃须刀组件共享的级联参数
这个级联参数是一个class,有很多信息来自 初始 HTTP 请求,在 _Host.cshtml 来自 httpContextAccessor.HttpContext
这个级联参数class获取了我之前的所有方法 静态方法。
这些方法可以使用级联参数的属性: RawUrl、UserAgent、ClientIp、...
这意味着要进行艰苦的重构工作以迁移遗留 ASP 网站。但是 Blazor 的表演是值得的。