3

ASP.NET MVC3 と SQL Server のデータベースを使用して、Web アプリケーション プロジェクトに取り組んでいます。REST サービスを介して同じデータベースのデータを使用するモバイル アプリケーションもあります。ここに私のアプリケーションのレイヤーのいくつかがあります:

  • モデル- Entity Framework を使用した ADO.NET データ モデル

  • データ アクセス レイヤー- データベースからデータを取得するためのクエリを含むリポジトリ

  • Web アプリケーション- リポジトリを使用する MVC3 プロジェクト、構造マップと DI を使用した疎結合、HttpRequest の最後でデータベース コンテキストが破棄される

  • コア- DAL とサービス層の間の別の層で、リポジトリを使用し、データをサービス層に公開します。ビジネスロジックレイヤーの一種。

  • サービス層- REST サービスは、コア層については知っていますが、DAL については知りません。データを DTO にマップし、クライアントに公開します

このようなアプリケーション アーキテクチャで私が抱えている問題は、サービス層での疎結合です。サービス層はコア層への参照を持っています。コア層はデータ アクセス層への参照を持ち、そのリポジトリを使用します。ただし、リポジトリにはデフォルトのコンストラクターがありません。1 つのパラメーターとそのデータベース オブジェクト コンテキスト (使い捨てオブジェクト) が必要です。

私のウェブサイトでリポジトリを直接使用しても問題ありません。私は構造マップを使用しており、DI はそれを疎結合にします。各コンテキストは、HttpRequest の最後で破棄されます。

問題は、そのサービス層とコア層です。そこにも疎結合が欲しいのですが、それを達成する方法がわかりませんか? それらにデータコンテキストを挿入し、特定の瞬間に破棄されるようにする方法は? すべてをまとめる方法についていくつかの提案を聞きたいです。

4

2 に答える 2

5

サービスレイヤーにはコアレイヤーへの参照があります。

それはいいです。

コア層はデータアクセス層への参照を持ち、そのリポジトリを使用します。

それは大丈夫ではありません。

「コア」は、ビジネスルールとロジックを備えたドメインである必要があります。依存関係があってはなりません。

スタックの一番下から開始します。

  1. リポジトリ-他のレイヤーへの依存関係はありません。
  2. サービス-コアとリポジトリへの依存。
  3. コア-他のレイヤーへの依存はありません。
  4. Web-すべてに依存します。

これは私たちのやり方です。緩い結合を処理するために、インターフェース駆動型プログラミングと依存性注入の組み合わせを使用します。

フローの例:

  1. HTTPリクエストが届きます(API、Web層など)
  2. コントローラが見つかりました。DIコンテナーは、コンテナーが依存関係を持っていることを確認ISomethingServiceし、それを解決します。これには、さらに下位の依存関係(サービス、リポジトリーなど)も含まれます。
  3. コントローラはでメソッドを呼び出しますISomethingService
  4. ISomethingService実装(DIによって選択)はでメソッドを呼び出しますISomeRepo
  5. ISomeRepo実装(DIによって選択)はEF / DBを呼び出し、「データオブジェクト」をサービスに返します。
  6. サービスは「data-object」を「Core」オブジェクトにマップし、コントローラーに戻ります。

これらのオブジェクトのインスタンス化は、DIコンテナで処理する必要があります。上記に欠けているのは、基本的にEFコンテキストをラップする「作業単位」だけです。

于 2011-07-11T23:49:36.737 に答える
1
public ServiceLayerClass()
{
    private ICoreLayerClass coreLayerClass;

    public ServiceLayerClass(ICoreLayerClass coreLayerClass)
    {
        this.coreLayerClass = coreLayerClass;
    }

    public void DoSomeWork()
    {
        coreLayerClass.DoSomeWork();
    }
}

public CoreLayerClass()
{
    private ISomeRepository someRepository;

    public CoreLayerClass(ISomeRepository someRepository)
    {
        someRepository = this.someRepository;
    }

    public void DoSomeWork()
    {
        someRepository.DoSomeWork();
    }
}

public SomeRepository()
{
    public SomeRepository(IUnitOfWork uow)
    {
    }

    public void DoSomeWork()
    {
        //do some work
    }
}

注: UnitOfWork は、理想的には HttpContext ごとに作成されます。つまり、データコンテキストは最初のリクエストでその寿命を開始し、最後に破棄されます。リクエストごとに 1 つだけ使用します。

于 2011-07-11T23:33:01.470 に答える