我在 Blazor 客户端看到,我们可以调用 UI 组件来呈现共享页面中的其他元素,这也可以使用代码隐藏和 razor.cs 文件来完成。
但是如何调用可以在多个UI页面之间共享的纯代码文件,例如字符串MyFunc((,以便每个页面可以对返回的字符串进行不同的处理?
如果你不想要/不需要它,你甚至不必使用依赖注入。
您可以创建一个类并将其保存在内存中,就像任何其他类型的 CSharp 代码一样。
可选,但如果要使类可用于其他组件,在我的示例项目 BlazorImageGallery 中,我创建了一个名为 GalleryManager 的对象,我希望将其作为级联参数提供给其他组件:
public class GalleryManager
{
}
<CascadingValue Value="GalleryManager">
<ArtistListViewer></ArtistListViewer>
<ImageListViewer></ImageListViewer>
</CascadingValue>
然后在我的索引页面上,我加载库管理器:
protected override async Task OnInitializedAsync()
{
// Create the GalleryManager
this.GalleryManager = new GalleryManager(this);
// Load the Artists
this.GalleryManager.Artists = await ArtistService.GetArtistList();
}
我的索引页可以参考这个。库管理器贯穿我的应用程序生命周期。
和子组件:
/// <summary>
/// This parameter is available to call parent objects
/// </summary>
[CascadingParameter]
GalleryManager GalleryManager { get; set; }
如果您不想,则不必将其设置为级联参数,甚至不必将其放在页面上。我只是向您展示了一个在内存中加载类的示例。
Blazor 只是 C# 代码,由于我来自 Windows 窗体背景,因此感觉就像在家一样,因为该项将驻留在内存中,直到我退出页面或释放它。
可以创建一个服务 - 基本上是一个类,然后使用内置的 DI 将其注入到任何组件中。
例如-
public class SayHelloService()
{
public string SayHello()
{
return "Hello!";
}
}
然后像这样准备 DI -
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.Services.AddSingleton<SayHelloService>();
builder.RootComponents.Add<App>("app");
await builder.Build().RunAsync();
}
然后像这样注入到您的组件中
@inject SayHelloService Service
然后,您可以使用标准 Razor 语法在代码块或任何位置使用 Service。 例如-
<p>@(Service.SayHello())</p>