8

ASP.NET で 3 層アーキテクチャの Web アプリケーションを構築したいと考えています。しかし、循環参照の問題が発生しています。

私は3つの層を持っています:

  1. UI を含むアプリケーション層。
  2. すべてのロジックとドメイン クラスを含むビジネス レイヤー。
  3. すべてのデータベース インタラクション メソッドを含むデータ レイヤー。

ビジネス層でデータ層メソッドを使用してデータベース操作を実行しています。これらのメソッドでは、ドメイン クラス オブジェクトをデータ層に渡す必要がありますが、循環参照のために実行できません。

たとえば、Personいくつかのプロパティとメソッドを含むドメイン クラスがあります。今、それをデータベースに挿入したいと思いPersonます。Person クラスに という名前のメソッドがありInsertPerson()ます。このメソッド本体では、データ層の関数を呼び出してデータベースに挿入する必要があります。しかし、データレイヤー参照がビジネスレイヤーに追加され、その逆は不可能であるため、個人オブジェクト全体をデータレイヤーメソッドに渡すことができません。

では、どうすればこの問題を回避できますか? 提案してください。

4

4 に答える 4

6

それらを操作するためにドメイン オブジェクトをビジネス ロジックから分離することは可能ですか? したがって、データを記述するクラスがあり、比較的基本的な操作が含まれています。その後、ビジネス レイヤーは、データに対するより多くのアクションなります。多くの場合、1 つのアクションで複数の異なるクラスが使用されます。

その後、次の 4 つのアセンブリが作成されます。

  UI              /
  Business logic  | Domain classes
  Data layer      \

そのため、3 つの層すべてでドメイン クラスが共通の用語として効果的に使用されます。

私はこれがかなりうまくいくのを見てきました - それはあなたのドメインクラスが通常少し「ばかげた」ものになることを意味しますが、他のクラスから独立している側面のためのいくつかの検証などに関連するロジックをまだ含むことができます.

もちろん、代替アプローチはたくさんあります:)

于 2013-04-02T05:56:10.650 に答える
4

ビジネス ロジック dll には、データ アクセス レイヤーへの参照が含まれていてはなりません。データ アクセス レイヤーには、ビジネス ロジック DLL への参照が必要です。ビジネスロジックコードは、データベース(またはビジネスロジックの他の外部)にアクセスするために対話したいインターフェイスを定義する必要があり、他のdllはビジネスロジック層にサービスを提供するためにそれらを実装する必要があります。

これが依存性逆転の原則です。高レベルのモジュールは低レベルのモジュールに依存すべきではないと言っています。ここで、ビジネス ロジックは高レベル モジュールです。データ アクセス dll は、ビジネス ロジック dll の観点から見た実装の詳細にすぎません。

例を示す

BLL:

public interface IPersonRepository
{
    void SavePerson(Person p);
}
public class PersonServices
{
    PersonServices(IPersonRepository repo)
    {
      //
    }
    public void FirePerson(Person toFire)
    {
        toFire.FireHim();
        repo.SavePerson(toFire);
    }
}

ダル:

public class PersonRepository : IPersonRepository
{
   // ...
}
UI:
var repo = new PersonRepository();
var ps = new PersonService(repo);   // wire by hand or use container

ps.FirePerson(somePerson);

参考文献:

UI -> BLL
   ->ダル

DAL -> BLL

BLL -> 何もない!
于 2013-04-02T06:03:04.227 に答える
1

従来のDDDを使用することをお勧めします。ドメイン (ビジネス ロジック) は、DAL (永続化のためのインフラストラクチャ) への参照を持たない必要があります。インフラストラクチャが実装する必要があるインターフェイス (リポジトリ) を宣言するだけです。プレゼンテーション レイヤーはアプリケーション レイヤーのみを使用します (または、分散アプリに関する場合は分散サービス)。

ここに画像の説明を入力

(D)DDD の良い例: http://microsoftnlayerapp.codeplex.com/

于 2013-04-02T05:57:11.910 に答える
-1

アプリケーションで 3 層アーキテクチャを使用している場合、オブジェクトをデータ アクセス レイヤーに渡すことができません。オブジェクトはビジネス層でのみ使用できます。データ アクセス層でオブジェクトを使用する場合、最適なアーキテクチャはドメイン モジュールです。

于 2013-04-02T05:56:04.520 に答える