【问题标题】:Common property for all Blazor pages?所有 Blazor 页面的共同属性?
【发布时间】:2019-11-05 03:16:32
【问题描述】:

我需要为每个页面设置一些属性。例如,

private MyClass _myclass;
protected MyClass MyClass => _myclass ??= InitMyClass();

而不是将线条放在每个剃须刀页面上。 Blazor 的惯用方式是什么?基类(如何?)或在_Host.cshtml 中做一些技巧?

【问题讨论】:

    标签: c# asp.net asp.net-core blazor blazor-server-side


    【解决方案1】:

    一个基类(如何?)

    创建一个基类:

    public class MyBase : ComponentBase 
    {
        private MyClass _myclass;
        protected virtual MyClass MyClass => _myclass ?? ... ;
    }
    

    然后使用@inherits指令扩展基类:

    @page "/counter"
    @inherits MyBase
    
    <h1>Counter</h1>
    ...
    

    【讨论】:

    • 嗯,似乎依赖注入方式(在另一个答案中)更容易。无需创建另一个类。
    • @ca9163d9 依赖注入要求您使用单个实例或瞬态实例。如果是这种情况,您可以选择 DI。但是,如果您希望每个页面本身都有一个独立的属性,我相信@inherits 指令是首选。
    • 好奇,使用AddScope&lt;MyClass&gt;()有什么问题?
    • @ca9163d9 请参阅 Add services to an app:“Blazor WebAssembly 应用目前没有 DI 范围的概念。”
    • @ca9163d9 另见Utility base component classes to manage a DI scope :“使用@inject 或InjectAttribute 注入组件的服务不是在组件的范围内创建的,而是与请求范围相关联的。”
    【解决方案2】:

    MyClass 添加为作用域服务并将其注入到您想使用的任何位置。

    Startup.cs

    service.AddScoped<MyClass>()
    

    现在您可以使用@inject 指令在每个页面中注入相同的实例。

    Index.razor

    @inject MyClass myClass
    

    https://docs.microsoft.com/en-us/aspnet/core/blazor/dependency-injection

    【讨论】:

    • 我正在转换来自 Asp.Net web api 项目的代码。原始代码是通过创建一个baseController并让每个控制器继承它来实现的。和AddScope&lt;...&gt;()一样吗?
    猜你喜欢
    • 1970-01-01
    • 2023-02-24
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多