私はこれを一度読んだことがあります:
「正当な理由がない限り、エンティティをゲッターとセッターのバッグのままにして、それらのメソッドを別のレイヤーに配置しないでください」
私の顧客、注文、... オブジェクトは SqlDataReaders からデータを取得するだけです。ゲッターとセッターしかありません。
私の最初の質問は、誰かがエンティティにメソッドを実装し、これらのメソッドが何をしているのかということです。
私はこれを一度読んだことがあります:
「正当な理由がない限り、エンティティをゲッターとセッターのバッグのままにして、それらのメソッドを別のレイヤーに配置しないでください」
私の顧客、注文、... オブジェクトは SqlDataReaders からデータを取得するだけです。ゲッターとセッターしかありません。
私の最初の質問は、誰かがエンティティにメソッドを実装し、これらのメソッドが何をしているのかということです。
この考え方は、ドメイン駆動設計コミュニティから来ています。
DDD では、ユーザーが要求する機能をキャプチャするドメイン モデルを作成します。エンティティは、機能と必要なデータを持つように設計します。それらを集約してグループ化し、構築(ファクトリ)とクエリ(リポジトリ)を担当する個別のクラスを用意します。
ゲッター/セッターしかない場合は、「Anemic Domain Model」があります。Martin Fowler がこの記事でそれについて書いています。
貧血ドメイン モデルの問題は、データベースをオブジェクトにマッピングするオーバーヘッドがありますが、そのメリットがないことです。エンティティを実際のドメイン モデルとして使用しない場合は、データに DataTable などを使用し、ビジネス ロジックを別の関数に保持してみませんか? Anemic Domain モデルは避けるべきアンチパターンです。
また、エンティティを自分でマッピングすることにも言及しています。このブログでは、オブジェクト リレーショナル マッピング ツールの使用が本当に役立つ理由について説明します。Code First アプローチで Entity Framework を使用すると、データと機能の両方を備えたクリーンなドメイン モデルを作成し、それをデータベースにマップすることができます。そうすれば、両方の長所を活かすことができます。
モデルの一部としてメソッドがある場合は、モデル固有のタイプのロジックのみを含める必要があります。たとえば、銀行口座を考えてみます。
public class Account {
public AccountId Id { get; set; }
public Person Customer {get; set; }
public void Credit(Money amount) { ... }
public void Debit(Money amount) { ... }
}
Credit と Debit はモデル固有のロジック (アプリケーションの他の場所にはありません) であり、Account クラスにカプセル化する必要があります。
また、モデル クラス内で SqlDataReader を使用してデータベースからデータを取得したことにも言及しました。これは大きなアンチパターンです。これで発生する問題は次のとおりです。
モデルをスリムに保ちます。データ アクセス ロジックをリポジトリ、つまり AccountRepository に配置します。