web-dev-qa-db-ja.com

DALレイヤーとBLLレイヤー間でのデータおよびビジネスオブジェクトの取得の分離

この質問を投稿する前に、いくつか調査を行いました。他の質問や投稿の中で、そのうちの1つを以下に示します。どのように決定するか明確な心を得ることができませんでした。

データアクセスレイヤー内のビジネスオブジェクト

リポジトリがあり、ビジネスレイヤーはリポジトリを呼び出してデータを取得します。たとえば、BLLとDALの次のクラスがあるとします。

class BllCustomer
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public BllAddress Address {get; set;}
}

class BllAddress
{
     public int AddressId {get; set;}
     public String Street {get; set;}
     public String City {get; set;}
     public String ZipCode {get; set; }
}

class DalCustomer 
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public int AddressID {get; set;}
}

class DalAddress
{
     public int AddressId {get; set;}
     public String Street {get; set;}
     public String City {get; set;}
     public String ZipCode {get; set; }
}

BLLがCustomerオブジェクトを取得したい場合は、DALでGetCustomerById(customerId)を呼び出します。

以下は私が明確な心をつかむことができなかった私の懸念です:

  1. DALのGetCustomerByIdが返すオブジェクトを決定する方法がわかりません。 BllCustomerまたはDalCustomerを返す必要がありますか?

  2. 顧客に関連付けられた住所の取得(および/またはビジネスオブジェクトへの変換)はどこにありますか?

DALがDalオブジェクトを返す場合、アドレスを取得して入力するロジックはBLLにのみ存在できます。 DALがBLLオブジェクトを返す場合、アドレスを取得して入力するロジックは、BLLまたはDALのいずれかになります。現在、DALはビジネスオブジェクトを返し、それを埋めるロジックはDALにあります。

私が読んだことから、私は正しいことも悪いこともないと思います。上記のリンクから、ある方法で他の人が言っている人がいます。しかし、どの方法が私のケースに最適かを判断するにはどうすればよいですか?

任意の助けいただければ幸いです。

9
ShamirDaj

DALのGetCustomerByIdが返すオブジェクトを決定する方法がわかりません。 BllCustomerまたはDalCustomerを返す必要がありますか?

DalCustomerオブジェクトを返す必要があり、BllCustomerオブジェクトを返すと single-responsibility の原則に違反します。 DalCustomerオブジェクトは、ビジネスレイヤー(またはコンシューマー)が使用するインターフェイスまたはコントラクトとして表示できます。実際には、BllCustomerを返した場合、DALはそれを呼び出す、または呼び出す可能性のあるすべてのビジネスレイヤーオブジェクトに対応する必要があります。

顧客に関連付けられた住所の取得(および/またはビジネスオブジェクトへの変換)はどこにありますか?

変換は ビューモデル またはマネージャで行う必要があります。サービスまたはデータアクセスコンポーネントを呼び出すための仲介者が必要です。必要に応じて、BllCustomerオブジェクトで変換を行うことができます。ただし、たとえば、DALをMSSQLからOracleに交換する場合、返されるオブジェクト(またはインターフェイス)は同じままにする必要があります。

できれば、ビジネスレイヤーもデータレイヤーから独立している必要があります。ビジネス層は、ビジネスルールを担当します。ここに、検証フレームワークを使用して検証を追加し、ビジネスルールを適用します。

5
Derika

リポジトリはBLLまたはドメインオブジェクトを返す必要があります。おそらく、DALオブジェクトはまったく必要ありません。

public class Customer
{
    public string Name {get; private set;}
    public Customer(string name)
    {
        this.Name = name;
    }
}

public class Repository
{
    public Customer GetCustomer(string id)
    {
        //get data from db
        return new Customer(datarow["name"]);
    }
}
4
Ewan

通常、DALはBLLを認識していません。このように考えると、BLLが異なる別のアプリケーションが同じDALを使用できます。同じ会社のPayablesアプリケーション/モジュールとReceivablesアプリは、データ(クライアント、料金、支払いなど)を共有します。 1つDLL複数のBLLの知識を持つことは非常に困難で不要です。これにより、BLLに影響を与えずにデータストレージを変更することもできます(ただし、インターフェースを壊さないでください)。

これで、DALオブジェクトをBLLに渡すことができます。または、3番目のオブジェクトセットであるエンティティを作成することもできます。これらには、一緒に渡される値のみが含まれます。 DALはエンティティを参照し、ストレージ/データベースと対話し、BLLはすべてのロジックを処理してDALを参照します。

class EntCustomer
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public BllAddress Address {get; set;}
}
class BllCustomer
{
   //reference EntCustomer, DalCustomer and handle business rules/logic
}

class DalCustomer 
{
   //reference EntCustomer and interact with data storage
}
3
JeffO