MySQL を永続化に使用する多層パターンを実装するアプリケーションを開発しています。データへのアクセスを提供し、DTO を提供する WCF サービスがあります。
さらに、次のパターンを実装する予定です: - DTO - MVP (パッシブ ビューまたは監視コントローラーかどうかはまだわかりません) - 適用可能なインターフェイスに対するコード
現在、私は生のまま次のプロジェクト構造を持っています:
+-------------------------------+
| MySQL DB Server |
+------+------------------------+
^
| Uses Entity Framework 5.0
|
+
+-------------------------------------------------------------------------------+
| Application Server |
|-------------------------------------------------------------------------------|
|+------------------+ +----------------+ +--------------+ +--------------------+|
|| Data Access Layer| | Contracts | | Communication| | Business Layer ||
||------------------| |----------------| |--------------| |--------------------||
|| - EF 5.0 Entities| | - WCF Contracts| | - WCF Service| | - Actual Service ||
|| | | | | Hosts | | - Session management|
|| | | | | | | - Security and ||
|+------------------+ +----------------+ +--------------+ +--------------------+|
+-------------------------------------------------------------------------------+
^
| Communicates via DTOs which are acutally wrappers for Entities
| eg. GetUserByID() or SaveUser(userDTO)
|
|
+-------+-----------------------------------------------------------------------+
| Clients |
|-------------------------------------------------------------------------------|
|+-------------------+ +-------------------+|
|| Business Layer |+----------------------------------->| GUI (Winforms) ||
||-------------------| BLL receives DTOs and creates |-------------------||
|| -Provide WCF Servi| Domain Objects (eg. User) which are| -Implementation of||
|| ce Access | Processed by presenters and passed | View Interfaces ||
|| -Service Reference| to views where they are bound to | ||
|| -Implementation of| controls. | ||
|| Presenter Interf.| | ||
|+-------------------+ +-------------------+|
+-------------------------------------------------------------------------------+
+------------------------------------------------------------------------+
| General |
|------------------------------------------------------------------------|
|+---------------------+ +--------------------+ +-----------------------+|
|| DTOs | | Interfaces | | Library ||
||---------------------| |--------------------| |-----------------------||
|| -DTO Definitions | | -View Interfaces | | -General Helper Classe||
|| | | -Presenter Interf. | | s eg. Cryptography ||
|| | | -Domain Model IF. | | ||
|+---------------------+ +--------------------+ +-----------------------+|
+------------------------------------------------------------------------+
外側のボックスは、Visual Studio のプロジェクト フォルダーです。内側のボックスは C# プロジェクトです
コーディングを続けて実際の実装に時間を費やす前に、自分のプロジェクトの構造やアーキテクチャについてフィードバックをもらいたいと思っています。
私は次の質問に頭を悩ませています:
- 上記の構造は「ベストプラクティス」に準拠していますか? 例えば。インターフェイスの場所、DTO
- 2 つのビジネス レイヤーを使用したり、ビジネス レイヤーをクライアントとサーバーに分割したりしても問題ありませんか? サーバー BLL はセッション管理やセキュリティなどの一般的な機能を提供し、クライアント BLL はサービス アクセスを提供します。プレゼンターによるビューも制御します。
- サーバー側は現在、ドメイン オブジェクトについて認識していません。ここでも使った方が良いでしょうか?これにより、エンティティがドメイン オブジェクトにマッピングされ、次に DTO にマッピングされます。
- WCF サービスから DTO を受け取るのは一般的ですか、それともドメイン オブジェクトを使用する必要がありますか (ここでよく議論されていることは知っていますが、私が理解していることから、ドメイン オブジェクトがそれほど複雑ではなく、マッピングとコーディングを節約できる場合に適用できます)ドメイン オブジェクトとデータベースを変更するときの労力) これにより、エンティティ<->ドメイン オブジェクト<->DTO<->ドメイン オブジェクトのような通信チェーンを維持するのが非常に難しくなりませんか?
- バリデーションはどこに置く?主な検証はドメインオブジェクトに行われますが、基本的な検証をビューまたはプレゼンター (たとえば、書式設定、null/not null 値など) に入れることを考えました...?
- データベースに新しいレコードを作成するとき、たとえば新しいユーザーの場合、クライアントも新しい DTO をサーバーに渡す必要がありますか、それとも string や int などの単純なデータ型を受け入れるサービス メソッドを作成する方がよいでしょうか?
この長い投稿で申し訳ありませんが、私の質問を 1 つの投稿にまとめて、プロジェクトの構造を提供する方がよいと思います。
どんな種類の答えでも前もって感謝します。
よろしく