Как я могу объявить модель глобальных переменных в BLAZOR?

Как объявить модель глобальных переменных в BLAZOR WASM? Допустим, у меня есть следующая модель, и я хочу иметь доступ к каждой переменной из модели в любом месте всего моего проекта (страницы, службы, компоненты, где угодно). Не могли бы вы мне помочь ?

public class UserInfoGlobalClass
{
    public string User_Name { get; set; } = "JOHN SMITH";
    public string User_Email { get; set; } = "[email protected]";
    public string User_Role { get; set; } = "Administrator";
    public string USER_ID { get; set; } = "85f04683-0d37-4947-a09d-bbb464a92480";

}

Внедрить модель как услугу.

Brian Parker 02.04.2022 02:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете внедрить свой класс как одноэлементный сервис:

builder.Services.AddSingleton<UserInfoGlobalClass>();

Включите в услугу класс как ctor параметр.

В компоненте или на странице: @inject UserInfoGlobalClass UserInfoGlobalClass

Хотя бы для того, чтобы это было динамично. Вам нужно будет украсить свой класс событием, чтобы уведомлять страницы и компоненты о вызове StateHasChanged() при обновлении содержимого. Обычно я устанавливаю свойства в частный набор и предоставляю метод для их изменения, который, наконец, вызывает событие для уведомления слушателей.

public class UserInfoGlobalClass
{
    public string User_Name { get; private set; } = "JOHN SMITH";
    public string User_Email { get; set; } = "[email protected]";
    public string User_Role { get; set; } = "Administrator";
    public string USER_ID { get; set; } = "85f04683-0d37-4947-a09d-bbb464a92480";
    
    public event EventHandler UserChangedEvent;

    public void SetUser(User user)
    {
        User_Name = user.Name;
        ... repeat for properties.
        UserChangedEvent?.Invoke();
    }
}

Используйте в другом сервисе.

builder.Services.AddScoped<SomeOtherService>();
public class SomeOtherService : IDisposable
{

    private readonly UserInfoGlobalClass userInfoGlobalClass;

    public SomeOtherService(UserInfoGlobalClass userInfoGlobalClass)
    {
        this.userInfoGlobalClass = userInfoGlobalClass;
        userInfoGlobalClass.UserChangedEvent += UserChanged;
    }

    public void UserChanged(object sender, EventArgs e)
    {
        // Process user details change.
    }

    public void SetNewUserMethod()
    {
         userInfoGlobalClass.SetUser(new User { ... });
    }

    
    public void Dispose() => userInfoGlobalClass.UserChangedEvent -= UserChanged;
}

На странице или компоненте:

@implements IDisposable
@inject UserInfoGlobalClass UserInfoGlobalClass

...

@code {
    protected override void OnInitialized()
    {
        userInfoGlobalClass.UserChangedEvent += StateHasChanged;  
    }
    
    public void public void Dispose() => userInfoGlobalClass.UserChangedEvent -= StateHasChanged;
}

На самом деле я сделал это на основе этого видео youtube.com/watch?v=u5Y8s1hgEOU . Но я не могу использовать модель глобальных переменных из другого сервиса, потому что получаю сообщение об ошибке. Скажите, пожалуйста, как я могу использовать UserInfoGlobalClass внутри другой службы, потому что я хочу использовать одну или несколько переменных из другой службы. @inject UserInfoGlobalClass UserInfoGlobalClass в другом сервисе не работает. Можете ли вы предоставить более подробную информацию для: «Вам нужно будет украсить свой класс событием, чтобы уведомлять страницы и компоненты о вызове StateHasChanged() при обновлении содержимого». ? Спасибо

Tom Cat 02.04.2022 08:56

@TomCat Я дополнил свой ответ, надеюсь, это поможет.

Brian Parker 02.04.2022 09:12

Суть такова: я хочу иметь доступ ко всем глобальным переменным из общедоступного класса UserInfoGlobalClass во всем проекте! Все глобальные переменные из общедоступного класса UserInfoGlobalClass инициализируются до требуемых значений только тогда, когда пользователь входит в систему и выходит из нее. Можете ли вы предоставить мне самый простой способ сделать то, что я хочу? Большое спасибо !

Tom Cat 02.04.2022 22:49

Как насчет использования CascadingParameter? Быстрый пример:

Чтобы сделать ваши переменные доступными для всех компонентов:

В MainLayout.razor — в разделе @code:

 private UserInfoGlobalClass userInfo = new UserInfoGlobalClass();

В MainLayout.razor — вокруг раздела @Body:

  <CascadingValue Value = "@userInfo">
      @Body
  </CascadingValue>

Затем в любом из ваших компонентов, где вам нужно получить доступ к объекту UserInfoGlobalClass — в разделе @code:

  [CascadingParameter]
  public UserInfoGlobalClass? userInfo { get; set; }

Чтобы использовать эти переменные в сервисе:

В моем случае я бы просто передал объект или требуемую переменную в качестве параметра службам, где мне нужно ее использовать:

MyComponent.razor:

{
    await MyService.Get(userInfo);
}

MyService.cs:

public List<MyObject> Get(UserInfoGlobalClass userInfo)
{
   //...service logic here
}

В моем собственном проекте я использую это, например, когда мне нужно передать CurrentUser (ApplicationUser) нескольким компонентам во всем моем проекте, и я хочу загрузить текущего пользователя только один раз. Вы можете узнать больше об использовании каскадных параметров здесь.

Однако при использовании каскадных параметров может иметь недостатки и компромиссы. Что мне нравится в каскадных параметрах, так это то, что при изменении каскадного значения новое значение будет отправлено вниз по дереву компонентов, и все компоненты, которые его используют, будут обновлены. Но это может иметь проблемы с производительностью, если значения постоянно меняются.

Проголосовали за, так как это хорошее решение для обработки текущей информации о пользователе, которая меняется не очень часто. У этого также есть некоторые преимущества: Microsoft — каскадные значения и параметры Blazor

Yogi 02.04.2022 10:40

Другие вопросы по теме