Проблемы, показывающие ошибки проверки с решением in Blazor PWA VS-2019

#visual-studio #validation #blazor #progressive-web-apps #data-annotations

Вопрос:

Наше решение VS-2019 предназначено для шаблона PWA, настроенного для .Net CORE-5.

У меня возникли трудности с кодированием для проверки CRUD в коде приложения PWA.

Решение VS-2019 содержит три проекта. Код класса модели БД И пользовательский код атрибута проверки находятся в ОБЩЕМ проекте. Интерфейсы и код DB-API определены в проекте СЕРВЕРА (с использованием «репозиториев» для каждого класса модели). Пользовательский интерфейс «CRUD» HTML и @code находится в клиентском проекте.

Мы используем аннотацию данных и пользовательские атрибуты проверки для каждого из полей CRUD в классах и полях модели по мере необходимости.

У нас есть требование, чтобы при добавлении или редактировании записи «Клиент» «Имя пользователя» должно быть уникальным для всех других «клиентов». У нас есть пользовательский атрибут проверки, который вызывается во время проверки, который должен отображаться в пользовательском интерфейсе, когда «Имя пользователя» не является уникальным. Алгоритм проверки на наличие других дубликатов «имени клиента» довольно прост, НО он требует извлечения списка «имен клиентов» из всех других «клиентов».

Итак, проблема в том, как мне извлечь список «имен клиентов» из кода СЕРВЕРА при вызове из ОБЩЕГО кода, чтобы определить, является ли «имя клиента» уникальным или нет? Следующий ВВОДИМЫЙ код (определенный в проекте СЕРВЕРА) всегда возвращает значение NULL для переменной «CustomerService» в ОБЩЕМ коде, что предотвращает возможность получения данных из базы данных.

[Inject] public ICustomerService CustomerService { get; set; }

У нас есть следующие ЗАВИСИМОСТИ ПРОЕКТА в VS-решении:

  • КЛИЕНТ зависит от ОБЩЕГО ДОСТУПА.
  • СЕРВЕР зависит от ОБЩЕГО ДОСТУПА и КЛИЕНТА.
  • ОБЩИЙ доступ не имеет зависимостей-ПОТОМУ что-VS жалуется на циклические зависимости.

Я в растерянности относительно того, «что делать дальше».

Дополнительные consideration…in событие КЛИЕНТ/пользовательский интерфейс onSubmit , я успешно протестировал на уникальность с помощью функции БД, НО, НО, НО … Я не знаю, как сделать так, чтобы сообщение об ошибке отображалось в сводке проверки. Есть какие-нибудь мысли?

Ваши вопросы, комментарии и решения приветствуются.

Ответ №1:

[Inject] public ICustomerService CustomerService { get; set; }

Это синтаксис Blazor, он не будет работать на сервере. Это называется внедрением свойств и работает только в компонентах (файлы.razor или .razor.cs).

Используйте инъекцию конструктора и убедитесь, что служба зарегистрирована в классе запуска сервера.

как мне получить список «имен клиентов» из кода СЕРВЕРА при вызове из общего кода

Ты не можешь. Перечисленные вами зависимости верны, общий проект не имеет доступа к Серверу.
На сервере необходимо выполнить уникальную проверку.


Обновить:

вам не нужно «получать список», чтобы проверить уникальность. Основой будет вызов метода, например Task<bool> AnyAsync(...) , в вашем репозитории или на уровне данных.

Если вы хотите получить эту проверку на клиенте, вам придется создать для нее конечную точку API.

Атрибуты проверки могут оставаться в Общем проекте, но afaik [Уникальный] вступит в силу только при создании схемы базы данных.

Внедрение конструктора (сервер или клиент) выглядит следующим образом

 public class DataAccess : IDataAccess
{
    public DataAccess(HttpClient http)
    {
        _http = http;
    }
}
 

Комментарии:

1. Спасибо тебе, Хенк… Вы мне очень помогли. Так что теперь я действительно застрял. Могу ли я спросить «как» я должен кодировать для этой проверки сервера с помощью Blazor? Могу ли я удалить пользовательский атрибут проверки из поля модели? Какой код должен быть доступен в коде компонента, чтобы на сервере могла выполняться проверка сервера? Надеюсь, вы можете помочь мне с (а) ссылками на решения(ы) или (б) некоторыми фрагментами кода с «местоположениями» кода (HTML/@code{}/ОБЩИЙ доступ/СЕРВЕР/STARTUP.cs… другое). Заранее спасибо.

2. @Хенк… Не могли бы вы объяснить свой комментарий: «Используйте инъекцию конструктора…». Я мало знаю о Startup.cs и регистрации сервиса. Спасибо. Джон