すべての状況で何が絶対に正しいかについて話すことはできません (何もそうではないだけでなく、私が真の「エンタープライズ」開発者ではないため)、しかし...
- 挿入や更新などのデータベース/エンティティ操作は、通常、すべてのデータベース操作をカプセル化する Repository クラスによって処理されます。リポジトリ メソッドは、データベース レコード (適切な ORM がある場合はレコード) を表すエンティティ クラス オブジェクトを受け入れるか、または返します。エンティティ オブジェクトは POCO である必要があり、それ自体をデータベースに直接結び付けるロジックを含めないでください。これにより、デフォルトのリポジトリ実装をモックに交換できるため、テストが非常に簡単になります。
- .NET の世界では、EF
DbContext
は既にリポジトリであることに注意してください。自分でリポジトリ パターンを再実装する必要はありません。
- エンティティ オブジェクトのメモリ内状態で動作するアクセサーとミューテーターのみ。これには単純なプロパティが含まれますが、たとえばフィールド
とフィールド
Person.GetFullName()
を連結するものなども含まれます。Person.FirstName
Person.LastName
- そのため、実際には Person に対する操作ではなく、電子メール システムに対する操作であるため、
Person
クラスのメソッドを呼び出す必要はありません。SendEmailTo()
- 一般的に言えば、いいえ。ビジネス ロジックは、着信メッセージ (クライアント イベントやポーリング タイマーなど) に応答して発生する必要があり、単なるリポジトリ タスクとは別の問題です。
単純な CRM を実装する方法は次のCustomer
とおりです (単一のエンティティである )。
エンティティ クラスDBCustomer
:
(おそらく Entity Framework によって生成されます) は、データベースに格納されている顧客を表します。
class DBCustomer {
public String FirstName { get; set; }
public String LastName { get; set; }
public String FullName { get { return this.FirstName + " " + this.LastName; } }
}
リポジトリ
Entity FrameworkDbContext
はリポジトリ オブジェクトであるため、ここで作業を行う必要はありません。
ビジネスの論理
...WCF メッセージ ハンドラーなど - ただし、特にビジネス アクションがデータベース アクションに直接対応する場合など、ロジックが非常に単純な場合があります。
StatusCode Customer_Add(CustomerXml newCustomerXml) {
DBCustomer newCustomer = createNewCustomerFromXmlMessage( newCustomerXml );
using( MyDbContext dbc = CreateDbContext() ) {
dbc.Customers.Add( newCustomer );
dbc.SaveChanges();
}
return StatusCode.Success;
}
ここで、役に立たないレイヤーがたくさんあることに気付くかもしれません。CustomerXml クラス (逆シリアル化された以前の XML 形式のメッセージを表す) を使用して、EF コンテキスト メソッドを WCF メッセージ イベント ハンドラーから直接呼び出すことができます。非常に些細なプロジェクトでは機能しますが、プロジェクトが大きくなるにつれて、すべてのステップでカスタム ロジックを追加する必要があることがわかり、突然物事がすぐに管理不能になります。
したがって、単純なデータ駆動型の Web サイトの場合、単純な「ame レイヤーですべてを行う」アプローチはうまく機能しますが、仕様に多くの細かな点がある「エンタープライズ」アプリケーションでは、これらの追加のレイヤーが必要になります。