Могу ли я использовать несколько OwningComponentBase <T>в своем приложении Blazor? - PullRequest
0 голосов
/ 23 апреля 2020

Я использую шаблон приложения Blazor для изучения и хочу добавить новую страницу в CRUD для новой таблицы. Я создал для него новый сервис.

Шаблон уже пришел с CRUD-страницей и сервисом. На своей странице бритвы он имеет
@inherits OwningComponentBase<WeatherForecastService>
Это прекрасно работает.

На своей новой странице я добавил
@inherits OwningComponentBase<ClientService>
, но теперь Service в OnInitializedAsync() не работает, у меня нет доступа к методам моего ClientService.
Мне удалось заставить его работать, чтобы добавить
@inject ClientService ClientService
и использовать вместо него ClientService.

Но мне интересно, если это правильный подход и не должен
@inherits OwningComponentBase<ClientService>
просто работать?

Я добавил службу к ConfigureServices:
services.AddScoped<WeatherForecastService>();
services.AddScoped<ClientService>();

1 Ответ

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

OwningComponentBase предназначен для одной конкретной c цели: он предоставляет сервисы, относящиеся к компоненту. Существует три объекта жизни: временные, ограниченные или одиночные. Синглтон не является проблемой, поскольку у вас когда-либо будет только один экземпляр, но переходный процесс и область действия с Blazor работают не совсем правильно, потому что в любой модели хостинга (сервер или клиент) вещи сохраняются гораздо дольше, чем в традиционное веб-приложение.

Существует универсальная c и не универсальная c версия OwningComponentBase. В версии generi c (той, которую вы используете в настоящее время) вы получаете доступ к одному сервису с определенными областями (через Service) типа, указанного в параметре типа generi c. Здесь нет ничего по-настоящему волшебного. Это буквально просто установка экземпляра T, типа generi c, на свойство Service, которое будет удалено, когда компонент выйдет из области видимости (за что отвечает OwningComponentBase). Версия non-generi c просто дает вам доступ к свойству ScopedServices, которое является просто поставщиком услуг с областью действия, из которого вы можете получить любую понравившуюся вам услугу, поэтому вы можете просматривать версию generi c как только с помощью этой службы области действия провайдер, чтобы получить одну услугу для вас и установить Service с этим.

Длинным и коротким, вы можете бросить любой тип, который вы хотите в параметре типа generi c, предполагая, что он зарегистрирован у поставщика услуг. Все, что вы сказали нам здесь, это то, что это «не работает», поэтому неясно, в чем ваша проблема. Скорее всего, вы просто не зарегистрировали свой ClientService через что-то вроде services.AddScoped<ClientService>().

...