1

NHibernateとASP.NetMVCを使用しているプロジェクトがあります。このアプリケーションは、ユーザーが特定のデータを追跡し、入力されたデータに基づいて統計のビューを生成できるようにすることを目的としています。これまでのところ、私のアプリケーションの構造は次のようになっています。

NHibernateレイヤー:エンティティマッピング定義だけでなく、クラスもRepository<T>含まれます。UnitOfWork

コア/サービスレイヤー:ジェネリックEntityServiceクラスが含まれています。現時点では、これは単にトランザクションスコープを定義し、より高いレベルのデータアクセスサービスを提供するためIUnitOfWorkにインターフェースします。IRepository

プレゼンテーション層(MVCアプリケーション):まだ実装されていませんが、通常のものと依存性注入が含まれています。

いくつか質問があります。

  1. MVCアプリケーションがすべてのレイヤーの依存性注入を処理できるようにするのは貧弱な設計ですか?たとえば、EntityServiceコントローラーへのインスタンスの依存性注入だけでなく、クラスIRepositoryへの依存性注入も処理します。EntityServiceこれは、2つの異なる場所で依存性注入を実行することを意味しますが、サービス層はこれ自体を処理する必要がありますか?

  2. 統計はどこで作成すればよいですか?このビジネスロジックは、現在、エンティティタイプの定義と、エンティティのプロパティを変更およびアクセスするためのインターフェイスのみが含まれているサービスレイヤーに属していないようです。私はこれについていくつか考えていますが、どれが一番好きかわかりません:

    • サービスレイヤーをそのままにして、別の統計プロジェクトを作成します。これは、使用されるエンティティタイプから完全に独立しています。つまり、MVCコントローラーは、ビジネスエンティティと(おそらく静的な)統計の間で生の数値情報を渡す必要があります。クラス。これは非常にきちんとした分離ですが、プレゼンテーション層にまだ多くのビジネスロジックが残っていることを意味する可能性があります。
    • 統計プロジェクトを作成します。ただし、このプロジェクトのクラスと私のビジネスエンティティの間に緊密な結合を作成します。たとえば、Readingオブジェクトのをメソッドに渡す代わりに、オブジェクト全体を渡します(またはそれらを拡張メソッドとして定義します)。これにより、ビジネスロジックがMVCアプリからシフトしますが、緊密な結合は少し厄介なようです。
    • すべてのビジネスロジックをサービスレイヤー内に保持します。の強く型付けされたサブクラスを定義しEntityServiceます。これにより、私のサービスには、エンティティクラス自体を純粋なデータコンテナとして維持しながら、エンティティ固有のビジネスメソッドとデータストレージメソッドの両方が含まれます。一般的な統計処理用に別の統計プロジェクトを作成し、派生したサービスクラスを介してそのメソッドを呼び出します。私のサービスクラスは、ビジネス機能をによって作成されたストレージ機能と効果的にマージしIRepository<T>ます。

私は3番目のオプションに向かって間違っていますが、誰かが何か考えを持っていますか?別の提案?

前もって感謝します!

4

2 に答える 2

3

予備観察:

私はあなたがあなたのプロジェクトを説明した方法が好きですが、なぜあなたのデータ アクセス レイヤー(DAL) が NHibernate レイヤーと呼ばれているのかわかりませんでした: 論理を説明するためにテクノロジ名を使用しなかった残りのすべてとは奇妙ですレイヤー(正しく)。そのため、名前を DAL に変更し、それを使用してアプリを NHibernate から抽象化することをお勧めします。

あなたの質問に対する私の意見:

  1. 絶対にありません。すべてのレイヤーに Dependency Injection を適用するとよいでしょう。それが良い理由のカップルまたは理由:

    1.1テスト: 別の DI 構成ファイルを使用して、DAL インターフェイスをモックし、DAL なしでサービス層の単体テストを実行できます。同様に、Service for Web Controllers レイヤーなどをモックできます。

    1.2さまざまな DAL 実装: プロジェクトのさまざまな展開や将来のスケーリングのために、さまざまな DAL 実装 (NHibernate の代わりに NOSQL、SQL、または LINQ など) テクノロジが必要であるとします。さまざまな DI 構成ファイルを簡単に維持できます。

  2. 同じレイヤーを異なるプロジェクトにデプロイできます。同様に、異なるレイヤーを含むプロジェクトを作成できます。それらの関係は直交していると思います。プロジェクトは、物理的な (開発時間と実行時間) 実装を記述しています。レイヤーは論理的です。したがって、最初は3番目のオプションでシンプルに保ちます. このオプションに関して次のように言う理由がわかりません。

一般的な統計処理用に個別の Statistics プロジェクトを作成し、派生したサービス クラスを介してそのメソッドを呼び出します。私のサービス クラスは、ビジネス機能と IRepository によって作成されたストレージ機能を効果的に統合します。

Statistics は 1 つまたは複数のサービスと見なされるため、Service Layer 内のクラスを含む名前空間として実装できます。また、他のサービスと同様に、DAL リポジトリ クラスを挿入できます。また、他のサービス/DAL と同様に、Model クラスは異なるサービスと DAL クラス間で共有できます。


StatsService.AverageReadingFor(Person p, DateTime start, DateTime end)いいですね。

いくつかの実装オプションがあります。

  1. 基盤となるリポジトリ機能の使用 (例: SQL avg 関数)
  2. 依存性注入を使用して実装可能なオブザーバー パターンを使用する
  3. アスペクト指向プログラミングの使用。例として、 Spring.Net の章を参照してください。

複数の Service Layer インスタンス (複数のサーバー) がある場合は、メッセージング システムを使用したアウト プロセス通信に 2 および 3 を適用する必要があります。

于 2012-11-18T18:09:10.550 に答える
0

ちょっと更新 - 私の 2 番目の質問に関しては、がコンストラクターに渡されることIStatsService<T>を期待するを定義することにしました。これをビジネス エンティティの一般的な統計処理に使用し、さらにタイプ固有の情報が必要な場合にIEntityService<T>実装するインターフェイスをさらに作成します。IStatsService<T>

これが、同様の問題について頭を悩ませている人の助けになることを願っています!

于 2012-11-19T13:05:38.367 に答える