Blazor - Dependency Injection не работает - PullRequest
0 голосов
/ 28 апреля 2020

У меня очень странная проблема в моем проекте Blazor. Я использую Dependency Inject для пользователя, мой сервис "CompanyService". Вот как я регистрирую свой сервис

// Servies Injection
services.AddSingleton<UserService, UserService>();
services.AddSingleton<CompanyService, CompanyService>();

И я внедряю этот сервис в свой бритвенный компонент как

@inject CompanyService CompanyService
@inject NavigationManager NavigationManager

Мне нужно передать эти сервисы моей ViewModel, и я делаю это вот так (CompanesList - это мое имя компонента Razor, так что оно является конструктором)

public CompaniesList()
{
    Context = new CompaniesListVm(NavigationManager, CompanyService);
}

Когда я отлаживаю этот код, я всегда получаю сервисы как нулевые (оба NavigationManager, CompanyService). Вот моя позиция файла в моем проекте

enter image description here

Может кто-нибудь, пожалуйста, помогите мне в этом?

PS Я также использую MatBlazor для мой пользовательский интерфейс.

Спасибо

С уважением, J

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Это неправильно:

services.AddSingleton<UserService, UserService>();
services.AddSingleton<CompanyService, CompanyService>();

Это должно быть:

services.AddSingleton<IUserService, UserService>();
services.AddSingleton<ICompanyService, CompanyService>();

Но если вы не определили интерфейсы, тогда это должно быть:

services.AddSingleton<UserService>();
services.AddSingleton<CompanyService>();

Где вы это делаете

 public CompaniesList()
{
   Context = new CompaniesListVm(NavigationManager, CompanyService);
 }

Показать весь ваш код ...

В любом случае используйте директиву @inject в части просмотра (Razor markups) вашего компонента, или определить свойство, аннотированное атрибутом Inject, например:

[Inject] Public NavigationManager NavigationManager { get; set; }

Надеюсь, это поможет ...

0 голосов
/ 28 апреля 2020

Проблема была в следующем:

Я инициализировал виртуальную машину в конструкторе, что неверно

public CompaniesList()
{
    Context = new CompaniesListVm(NavigationManager, CompanyService);
}

После изменения на

protected override void OnInitialized()
{
     Context = new CompaniesListVm(NavigationManager, CompanyService);
}

Все работает нормально.

С уважением

...