web-dev-qa-db-ja.com

複数のルックアップテーブルのMVCコアリポジトリパターン

外部キーを持つ複数のルックアップテーブルを持つCustomerトランザクションテーブルがあります。 CustomerServiceがCustomer注文トランザクションを作成するときに、これらのルックアップテーブルを使用してドロップダウンメニューを作成します。人が後でトランザクションを表示すると、4つのテーブルが結合されていることがわかります。

作成しますか

(a)4つのリポジトリーを持つ4つのインターフェース、

(b)または2つのインターフェース(カスタマートランザクション用に1つ、ルックアップテーブル用に1つのインターフェース)、カスタマートランザクション用に1つのリポジトリ、ルックアップテーブルインターフェース用に3つのリポジトリ?

ルックアップテーブルリポジトリを以下のSelectListに中継します。各選択リストは特定の列を選択しています。コードを効率的にしたい。

モデル:

public class CustomerTransaction
{
    public int CustomerTransactionId{ get; set; },
    public int ProductTypeId {get; set; }, //joins to ProductTypeTable
    public int StatusKey {get; set; },  //joins to StatusTypeTable
    public int CustomerTypeId {get; set; } //joins to CustomerTypeTable
    public string DateOfPurchase{ get; set; },
    public string PurchaseAmount { get; set; },
}

public class ProductType
{
    public int ProductTypeId{ get; set; }
    public int Size { get; set; }
    public int Weight { get; set; },
    public string ProductName { get; set; },
    public string ProductDescription { get; set; },
}

public class StatusType
{
    public int StatusKey{ get; set; }
    public string Description{ get; set; },
    public string Symbol { get; set; },
}

public class CustomerType
{
    public int KeyNumber{ get; set; },
    public int Height{ get; set; }
    public string HairColor{ get; set; },
    public string NameOfPerson{ get; set; },
    public string ResearchNotes{ get; set; },
}

ドロップダウンの必須フィールド

ViewData["ProductTypeId"] = new SelectList(_context.ProductType, "ProductName", "ProductDescription");

ViewData["KeyNumber"] = new SelectList(_context.CustomerType , "NameofPerson", "Description");

ViewData["StatusKey"] = new SelectList(_context.StatusType, "Symbol", "ResearchNotes");
4
SkyPool392

ルックアップテーブルのレコードを挿入、更新、または削除する必要がない場合は、それを実行できるようにするインターフェイスや具体的なリポジトリに煩わされないでください。代わりに、メソッドまたはプロパティを顧客トランザクションインターフェイスに追加して、ルックアップテーブルからレコードを取得します。これは、リポジトリインターフェースの追加のプロパティに変換されます。

public interface ICustomerTransactionRepository
{
    IEnumerable<ProductType> ProductTypes { get; }
    IEnumerable<StatusType> StatusTypes { get; }
    IEnumerable<CustomerType> CustomerTypes { get; }

    void Save(CustomerTransaction transaction);
    CustomerTransaction Find(int id);
}

リポジトリごとに1つのテーブルは必要ありません。リポジトリは、システムの主要エンティティに関連するすべてのデータ(またはドメイン駆動設計の原則を適用している場合は境界コンテキスト)へのアクセスを提供できます。

IEnumerable<T>顧客トランザクションリポジトリインターフェースのルックアップテーブルのプロパティ。これらのレコードをデータベースから取得して、ドロップダウンにオプションを入力できます。この1つのリポジトリオブジェクトをアプリケーションのサービスレイヤーで渡すこともできます。これは、顧客のトランザクションで行う必要があるすべてのことに関して、機能的に完了しています。ルックアップテーブルデータへのアクセスと顧客のトランザクションのCRUD操作により、これは「機能的に完了」します。

本当にで物事を分離したい場合は、リポジトリインターフェースを2つに分割できます。 1つはデータの取得用、もう1つはデータの変更用です。

public interface ICustomerTransactionRepository
    : IWriteOnlyCustomerTransactionRepository,
      IReadOnlyCustomerTransactionRepository
{
}

public interface IReadOnlyCustomerTransactionRepository
{
    IEnumerable<ProductType> ProductTypes { get; }
    IEnumerable<StatusType> StatusTypes { get; }
    IEnumerable<CustomerType> CustomerTypes { get; }

    CustomerTransaction Find(int id);
}

public interface IWriteOnlyCustomerTransactionRepository
{
    void Save(CustomerTransaction transaction);
}

次に、情報の取得または変更に重点を置いたインターフェースを渡すことができます。両方を継承する1つのインターフェースを作成し、これを1つのクラスに実装することもできますが、少なくとも懸念事項(およびSOLIDの「I」:インターフェース分離プリンシパル)を分離できます。

1
Greg Burghardt