ビジネスロジックは、データアクセスから完全に分離する必要があります。あなたが正しく言ったように、データアクセスのすべてのレイヤー間で共通のオブジェクトを渡すことは悪いことです。
- POCOを使用してレイヤー間でデータを渡し、依存関係のない共通のアセンブリでこれらを定義します(データを交換する必要があるすべてのプロジェクトがそれを参照する必要があるため)。
- ビジネスロジックとデータアクセスをインターフェイスで分離すると、インターフェイスはデータを送受信するために呼び出されるメソッドを定義します。そのデータは、基本的な基本型(int、string、boolなど)またはPOCO(共通アセンブリで定義)。
- データアクセスの実装では、必要なものを使用します。この場合はEFです。これは、EFオブジェクトをPOCOに変換する必要があることを意味しますが、アーキテクチャがクリーンであることを意味します。
しかし、エンティティのように(コード生成で)POCOを作成するにはどうすればよいですか?
私は、ビジネスロジックは、物事が概念的に「始まる」場所であるという観点から取り組んでいます。ドメインモデルを具体化すると言うこともかなり正確でしょう。
POCOは、情報を渡す方法です。ほとんどの場合、POCOの設計は、ビジネスロジック(またはドメインモデル)のニーズによって決定されます。ドメインモデル/DDDの考え方の場合、POCOはそのドメインの一部である可能性があります(現時点では、それが問題であるかどうかはまだわかりません)。
つまり、それらが(概念的に)どのように生成されるかは、ビジネスロジックのニーズによるものです。ただし、パフォーマンスが要件の重要な側面である場合は、パフォーマンス関連の問題(多くの個別の呼び出しではなく、1つの大きなDTOに大量のデータを戻すなど)によって引き起こされるものもある可能性があります。
それらはどのように物理的に生成されますか?ええと、私はそれらを手で書くか、一緒にハッキングした小さなツールを使って書きます。Structs
私はPOCOに(および)を使用する傾向がありCollections
ますが、代わりに使用することもできますclasses
。
いくつかの理由から、ビジネスロジックまたはドメインモデルから自動的に生成することを検討していません。
- それは難しい。
- 一度生成されると、それらはあまり変更されない傾向があります。また、すべてのアセンブリで使用されている場合は、システム全体をすぐに壊してしまいます。
- 私はさまざまな理由でさまざまなPOCOを作成しますが、それは間違いなく人間の判断のようなものです。