web-dev-qa-db-ja.com

Blazorプロジェクトの構造/ベストプラクティス

私の会社はレガシーコードベースからより近代的なプラットフォームに移行しており、私たちはBlazorに移行しています。私たちは現在ORMとベストプラクティスに参加しているだけで、プロジェクトのセットアップに関して(少なくとも私が収集したものから)多くの矛盾するアイデアがあるようです。私の現在の構造は次のとおりです:

最初はDALと呼ばれるクラスライブラリです。これが「データレイヤー」です。私たちはDapperを使用しており、比較的簡単です。クラスの例は次のようになります。

public class Person
{
      public string Id {get; set;}
      public string FirstName {get; set;}
      public string LastName {get; set;}

      public Person() {}
      public Person(DbContext context) {}

      public void GetPerson(int id) {}
      public void DeletePerson(int id) {}


      etc....
}

2番目のプロジェクトは、プロジェクトDALを参照するサーバーBlazorプロジェクトです。プロジェクトは次のように分割されます。

  1. モデル-これらは、現在作業中のプロジェクトに固有のモデルです。たとえば、1つのモデルが複数のテーブル(DALクラスのモデル)の組み合わせである場合や、Webページのフォームに使用されるフィールドのみである場合があります。

例はそのようなものかもしれません:

public class EmployeeModel
{
    public int Id {get; set;}
    public int Department{get; set;}
    public DateTime HireDate {get; set;}
    public decimal Salary {get; set;}
    public Person {get; set;}
}
  1. ページ-ページ参照を持つRazorページ/コンポーネント。
  2. 共有-Razorコンポーネント-複数のページで使用されるもの。例はモーダルです。
  3. サービス-これはビジネス層だと思います。現在、「モデル」フォルダにはモデル/クラスごとに1つのサービスがありますが、共有コンポーネント用のサービスもあります。 ModelsフォルダーのEmployeeModelの例は次のようになります。
public class EmployeeService
{
    private DbContext _dbContext = dbContext;
    public EmployeeService(DbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public Task<EmployeeModel> Get(int id)
    {
        var personRepository = new Person(_dbContext);
        var person = personRepository.Get(id);
        Id = id;
        if (id > 10)
            Department = "Accounting"
        etc...
    }

    public Task<int>CalculateBonus(DateTime hireDate, string department, decimal salary)
    {
         //logic here...
    }
}

サービスとdbcontextはすべて、startup.csによる依存関係の注入によって生成されます。ページクラスは、次の行に沿ってデータを読み込みます。


@code{

    [Parameter]
    int EmployeeId;

    public Employee employee;
    public decimal bonus;

    protected override OnAfterRenderAsync(bool firstRender)
    {
        if (!firstRender)
            return;

        employee = EmployeeService.Get(EmployeeId);
    }

    public void GetBonus()
    {
        if (employee != null)
            bonus = EmployeeService.CalculateBonus(employee.HireDate, employee.Department, employee.Salary) 
    }
}

これは今のところ問題ないようですが、さまざまな解釈がたくさんあります。たとえば、MVVMパターンを使用するというアイデアが気に入りました。私が最初にフォローしていた例は次のとおりです: https://itnext.io/a-simple-mvvm-implementation-in-client-side-blazor-8c875c365435

ただし、Model/ViewModelをその例のように分離する目的はわかりませんでした。彼らは同じことをしているように見えますが、アプリケーション内の異なる領域でのみです。オンラインでこの実装の他の例を見つけることもできなかったので、間違った道を進んでいると思い、最初はそれを破棄しましたが、その方法にも試してみるにはまだ早い段階です。たとえば、このメソッドでは、EmployeeServiceクラスは次のようになります。

public class EmployeeService
{
    private EmployeeModel _employeeModel;
    public EmployeeService(EmployeeModel employeeModel)
    {
        _employeeModel = employeeModel;
    }

    private EmployeeModel currentEmployee;
    public EmployeeModel CurrentEmployee
    {
        get { return currentEmployee}
    }
    {
        set {currentEmployee = value; }
    }

    public Task<EmployeeModel> Get(int id)
    {
         currentEmployee = EmployeeModel.Get(id);
    }

    public Task<int>CalculateBonus()
    {
         //logic implemented here with properties instead of parameters... 
    }
}

次に、ページでは次のようになります。


@code{

    [Parameter]
    int EmployeeId;
    public decimal bonus;

    protected override OnAfterRenderAsync(bool firstRender)
    {
        if (!firstRender)
            return;

        EmployeeService.Get(EmployeeId); //reference Employee on page with EmployeeService.CurrentEmployee
    }

    public void GetBonus()
    {
        bonus = EmployeeService.CalculateBonus();
    }
}

私がレガシーコードをどのように長い間使用していたか、他の人から他の方法で教えてもらえなかったので、私はそれが正しく行われていることを知りたいだけです。これは、今後のビジネスの中心となるはずであり、スパゲッティコードを使ったり、完全にリファクタリングしたりしたくないので、特にそうです。

私の質問は次のようだと思います:

  1. DALの現在の実装はどうですか?実際のプロパティをCRUD操作と一致させても問題ありませんか? DBContextのあるコンストラクタとないコンストラクタのように? CRUD操作のないクラス専用のライブラリーがいくつかのプロジェクトにあることを確認しましたが、その値はわかりませんでした。この方法の背後にあるロジックは、ほとんどのアプリケーションが単なるCRUD操作であるため、今後はすべてのアプリケーションでそのプロジェクトを再利用できるようにしたいと考えています。オンラインで見ると、この実装はDAL/BLLのハイブリッドです

    1. Blazorの現在の実装は「機能」しますか?または、私が従うことができる他のより良い設計プラクティスはありますか?私はMVVMが好きですが、これまでに見たどの実装にも価値がまったくありません。同じ名前/パラメータを持つ別のクラスの関数を呼び出すだけの、ページがViewModelの関数を呼び出す目的は何ですか?いわば中間者を切り取るのは理にかなっているのではないでしょうか。

    2. ここで何をすべきかについてより良いアイデアを得るために私が従うことができるサンプルのエンタープライズプロジェクトはありますか?私が述べたように、私の会社にはこれについて行くべき先輩が一人もいません。私はそれを可能な限り変化/専門家に適応できるようにしようとしています。

助けてくれてありがとう!

6
Dan

3層アーキテクチャーで作業しているときに、ビジネス層が成長し、ある時点が非常に乱雑になり密結合になることがわかります。

オニオンアーキテクチャ を試してみることをお勧めします。これは非常に人気があり、 クリーンアーキテクチャ に非常によく似ています。

私はあなたがいくつかのサンプルアプリケーションを探して、すべてのレイヤーを別々に保つ方法、ベストプラクティスとベストライブラリとは何かを見ていると確信しています。

以下のリンクを試してください、あなたはユーチューブでたくさんのビデオを得るでしょう。

Asp.netボイラープレート

ABPフレームワーク

Blazor Web Assemblyがまだプレビュー段階にあるので、asp.netcore 2.0からBlazorクライアント側およびサーバー側のAzure関数への個人のWebサイトの移行を開始します。

これが私のアプリケーション構造です

enter image description here

お役に立てれば幸いです。

0
Pankaj Rawat