すべてのレイヤーBLL、DAL、およびUIでクラス(コンクリートまたはインターフェイス)を共有する必要があります。
クラスの種類によって異なります。共通のドメインエンティティにアクセスするためにそれらすべてが必要な場合は、必ず。
重要な部分は、それらのレイヤーがそれらのクラスで何をできるようにするかです。クライアント/UIレイヤーは、一元化されたビジネスロジックを経由せずに、ドメインエンティティを変更(および永続化)できないようにする必要があります。つまり、共通のエンティティやインターフェースなどを共有することはできますが、UIからDALにアクセスすることはできません。
一般的なアプローチは次のようなものです。
UI-> BLL-> DAL->永続ストレージ(DB、ファイルなど...)
これらの各レイヤーは、共通クラスにアクセスできます。UIがDALに直接アクセスできない限り、問題はありません。これにはいくつかのオプションがあります。
- サービス(WCFなど)を介してBLLにアクセスできるようにする
- DALとBLLを同じプロジェクトに配置し、DALを内部にして、BLLのみがアクセスできるようにします。
最終的には次のようになります。
UI->サービス->BLL->DAL->永続ストレージ(DB、ファイルなど)
MartinFowlerによるPatternsofEnterpriseApplicationArchitectureを強くお勧めします。これは、アプリケーションを階層化するための優れた基盤を提供します。
DALメソッドからデータテーブルを返すのではなく、BLLが直接使用できるオブジェクトを返すことを好みます。
良い考えです。ここで、 ORMのアイデアが役立ちます。DALは通常、DBと通信する方法を知っており、DALはDB固有の構造をドメインモデルに変換する方法も知っています。ドメインエンティティは、DALに出入りします。DAL内では、データを永続化するときにドメインエンティティがDB固有の構造に変換されます。そして、その逆が起こります。BLLがデータを要求すると、DALはデータを取得し、それをドメインエンティティに変換してから渡します。