Blazor WebAssembly с чистой архитектурой - PullRequest
3 голосов
/ 04 февраля 2020

Я работаю над проверкой концепции проекта с использованием Blazor WebAssembly. У проекта уже есть интерфейс React, который я надеюсь воспроизвести в Blazor.

У меня есть следующие проекты в моем решении:

  • Домен - содержит сущности и не ссылается на какие-либо другие слои
  • Приложение - ссылается на домен и содержит DTO, команды / запросы (используя MediatR / Dapper), валидаторы (используя FluidValidation) и интерфейсы для последующих уровней для реализации
  • Постоянство - ссылается на приложение и использует EF Core для хранения моделей доменов в базе данных
  • API - веб-API, который регистрирует все, используя DI, и выставляет команды / запросы с уровня приложений через контроллеры
  • React Front End - использует AJAX для разговора с API

Я хотел бы сослаться на прикладной уровень в проекте Blazor WebAssembly, чтобы я мог повторно использовать правила проверки, существующие в отношении DTO. Может ли кто-нибудь пройти через код в браузере и извлечь конфиденциальную информацию, такую ​​как строки подключения, из команд / запросов?

Например, простой запрос может выглядеть следующим образом и проходить через код позволил бы проверить IDbConnection:

public class PayCategoryListQueryHandler
    : IRequestHandler<PayCategoryListQuery, PayCategoryListQueryVm>
  {
    private readonly IDbConnection _connection;

    public PayCategoryListQueryHandler(IDbConnection connection)
    {
      _connection = connection;
    }

    public async Task<PayCategoryListQueryVm> Handle(PayCategoryListQuery query, CancellationToken cancellationToken)
    {
      {
        var viewModel = new PayCategoryListQueryVm();

        viewModel.AddRange(
          await _connection.QueryAsync<PayCategoryListItemDto>(
            "SELECT Id, Description, MakeAttendedTimeZero, IsOffSite, IsVisibleToClient FROM PayCategory ORDER BY Description"));

        return viewModel;
      }
    }
  }

Нужно ли извлекать DTO и их проверку из отдельного слоя, который не содержит кода доступа к базе данных, чтобы предотвратить утечку строки подключения?

Разъяснение

Чтобы попытаться прояснить проблему, я хотел бы попытаться объяснить мою ситуацию немного лучше.

В моем текущем приложении используется фронт React конец с Formik и Yup, обеспечивающим проверку. Это означает, что каждый раз, когда вносится изменение в правило валидации, мне нужно отражать его в двух местах - на уровне приложения и в приложении React. Я надеялся, что переход на Blazor уменьшит дублирование, поскольку будет поддерживать только правила проверки на уровне приложений.

Архитектура, которую я сейчас использую, основана на примере приложения NorthwindTraders .

Используя этот пример, CreateCustomerCommand использует CreateCustomerCommandValidator , который будет отвечать на запросы POST через CustomersController . Чтобы использовать это для проверки на стороне клиента в Blazor WebAssembly, мне в настоящее время необходимо сослаться на прикладной уровень.

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

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Создайте новый do tnet .standard -проект, называемый чем-то вроде, MyProject.Domain.Shared . Там вы помещаете все коммуникационные (poco-) классы.

Shared-Project используется вашим Domain-Project , Application-Layer и Уровень клиента . Domain-Project используется Application-Layer и Persistence-Layer .

В Shared-Project вы положили:

  • DTO
  • Запросы
  • Ответы
  • Валидаторы

В домене -Проект вы положили:

  • Домен-объекты
  • Репозиторий-интерфейсы
  • Обработчики, которые принимают запросы и выдают ответы)
0 голосов
/ 06 марта 2020

чтобы отделить уровень представления от уровня приложения, даже если вы используете Blazor, вам не следует ссылаться непосредственно на код уровня приложения из любой точки уровня представления. Вместо этого вызывайте конечную точку API так же, как вы делаете это с внешним интерфейсом React.

Также, как заявили другие в комментариях, вы должны извлечь свой класс dto-poco в другой проект и сослаться на него.

...