web-dev-qa-db-ja.com

クリーンなアーキテクチャのBlazor WebAssembly

私はBlazor WebAssemblyを使用して概念実証プロジェクトに取り組んでいます。プロジェクトにはすでにReactフロントエンドがあり、Blazorでレプリケートしたいと思っています。

私のソリューションには次のプロジェクトがあります。

  • ドメイン-エンティティを含み、他のレイヤーを参照しません
  • アプリケーション-ドメインを参照し、DTO、コマンド/クエリ(MediatR/Dapperを使用)、バリデーター(FluidValidationを使用)、および実装する後続のレイヤーのインターフェイスを含みます。
  • 永続性–アプリケーションを参照し、EF Coreを使用してデータベースにドメインモデルを格納します
  • API-DIを使用してすべてを登録し、コントローラーを介してアプリケーション層からコマンド/クエリを公開するWeb API
  • Reactフロントエンド-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が検証を提供しています。これは、検証ルールに変更が加えられるたびに、2つの場所に反映する必要があることを意味します–アプリケーションレイヤーReactアプリケーション。Blazorに移行すると、アプリケーションレイヤーで検証ルールを維持するだけでよいので、重複が軽減されることを期待していました。

私が現在使用しているアーキテクチャは、 NorthwindTraders サンプルアプリケーションに基づいています。

その例を使用すると、 CreateCustomerCommandCreateCustomerCommandValidator を使用し、POSTを介して CustomersController 経由のリクエストに応答します。 Blazor WebAssemblyでclient-side検証にこ​​れを使用するには、現在アプリケーションレイヤーを参照する必要があります。

このシナリオでは、すべてのコマンド(コマンドハンドラーではない)とバリデーターを、Blazorから参照できる別のプロジェクトに移動する必要があります。コマンドハンドラーをアプリケーション層に残しておくと、データベースアクセスコードが削除されます。

4
Newm

blazorを使用している場合でも、プレゼンテーションレイヤーをアプリケーションレイヤーから分離しておくために、プレゼンテーションレイヤーのどのポイントからも一部のアプリケーションレイヤーのコードを直接参照しないでください。代わりに、Reactフロントエンドで行うのと同じ方法でAPIエンドポイントを呼び出します。

また、コメントで他の人が述べたように、dto-pocoクラスを別のプロジェクトに抽出し、これを参照する必要があります。

0
Matt