2012-05-02 9 views
2

私は現在作業しているASP.NET MVC 3アプリケーションを持っています。私は、ビジネスロジックを含み、コントローラによって利用されるサービスレイヤを実装しています。サービス自体はデータアクセス用のリポジトリを使用し、リポジトリはエンティティフレームワークを使用してデータベースと通信します。私のサービス層のサービスは、別々のプロジェクト/ DLL /アセンブリに存在する必要がありますか?

コントローラ>サービスレイヤ>リポジトリ(各サービスレイヤは、1つの注入可能なリポジトリに依存します)> Entity Framework>単一データベースです。

  • ChargePaymentCard(int cardId, decimal amount)( PaymentServiceの一部):

    私は自分自身がサービス層ではなどUserServiceの、のEventService、PaymentService、などの項目

    を作る見つける午前、私は、次のような機能を持っています

  • ActivateEvent(int eventId)(のEventServiceの一部)
  • SendValidationEmail(int userId)(UserServiceの一部)

また、これを使用している第2の場所の例として、これらのサービスを利用する、別の単純なコンソールアプリケーションがスケジュールされたタスクとして実行されています。これらのサービスの複数のを使用する必要がある次の第2のWebアプリケーションもあります。

さらに、私たちは物事を分割して(例えば、単一のデータベースなど)、サービス指向アーキテクチャーに移行し、これらのいくつかをWebサービスに分解することをお勧めしたいと思いますいつか非.NETアプリで使用される)。私は、SOAへの飛躍をより苦痛の少ないものにしてくれるかもしれない歩みを目の当たりにしてきました。

サービスごとに別々のアセンブリ(DLL)を作成する作業を開始しましたが、間違ったパスを開始したのかどうか疑問に思っています。私は柔軟性を持ち、物事を疎結合させようとしていますが、(SOAや一般的な方向へ)私を助けてくれる道でしょうか、あるいは単に複雑さを加えるだけですか?代わりに、サービスレイヤー全体を含む単一のアセンブリ/ dllを作成し、使用する必要のあるサービスがあればそのアセンブリを使用する必要がありますか?

私が開始している経路の意味は分かりませんので、これに関する助言をいただければ幸いです。

+0

WOW、今これは大きな質問です:) - いくつかの項目が必要です:アプリケーションはどれぐらいですか?あなたはどれくらいの負荷を期待していますか?これはどんなアプリケーションですか?多くの答えはプロジェクト全体の一般的な情報に依存するので、... – Sunny

答えて

2

IMO - あなたのアプリケーションの多くの要素によって決まります。

重要なアプリケーション(例:)SOAを学ぶために大学/趣味のプロジェクトではありません。

  • ユーザーサービス/イベントサービス/決済サービス - 独自のDLLを作成&つ以上のアプリケーションがある場合はWCFサービスとして公開このサービスを使用してDLLを別のアプリケーションに共有することが多すぎる場合
    - これらのサービスは相互に依存しないようにしてください&は個々の領域に集中する必要があります
    注:これらのサービスは、ログ、認証、データアクセスなどの共通サービス

  • 作曲・サービス を作成する - このサービスは、他のすべてのサービス
    間の呼び出しの構成を行います - たとえば:あなたは、ビジネスの流れは注文が置かということです&を注文している場合>確認ユーザが存在する(ユーザサービス)> OrderPlacedイベントを発生させる(イベントサービス)>支払いを確認する(支払いサービス)
    - このようなサービスコールのすべての構成はこのレイヤーで処理できます
    - 環境によってはこのサービスを独自のDLLとして公開するか、WCFとして公開するかを選択する可能性があります。
    - 注:this i他のサービス&への参照を共有する唯一のサービスは今構図

の単一のポイントになります。■ - このレイアウトで - あなたはそれと対話したい場合は、直接サービスを呼び出すためのオプションがありますサービスのみの場合&トランザクションを完了するために異なるサービスを作成する必要があるビジネスワークフローが必要な場合は、コンポジションサービスに電話する必要があります。

開始点として、私はSOAアーキテクチャーの本を読んで、多くの概念を明確にするのに役立つことをお勧めします。

私はこの回答を有意義に保つためにできるだけ短くしようとしました。同じことをする方法がたくさんありますが、これは可能な方法の1つです。

HTH。

+0

答えをありがとう。ですから、この時点で私は1つのDLLに結合し直します。これは重要なビジネスアプリケーションではありませんが、現在はトラフィックが非常に少ない(スタートアップ)。私はある時点で、UserServiceとPaymentServiceをWeb化して、別のボックスに入れたいと思っています。単一のDLLにそれらを保持することは、この潜在的な可能性から大きく外れないように思えます。私はSOAに向けてさらに進めることに決めました。 – Josh

+0

はい、別の時点に分割することができます。スプリットを簡単に行うことができるように、それらを結合しないように覚えておいてください。 – Sunny

2

サービスごとに1つのDLLを持つことは悪い考えです。マイクロソフトによると、パフォーマンスの影響(hereからthis postまで)のために、複数の小さなアセンブリに1つの大きなアセンブリを配置したいと考えています。

私はあなたの基本サービスまたはコアサービスを別のプロジェクトに分割し、その中に(すべてではないにしろ)ほとんどのサービスを保持します。あなたのニーズに応じて、Webプロジェクトやコンソールアプリケーションのコンテキストでのみ意味のあるサービスがあり、他の場所では意味がありません。これらのサービスは、「コア」サービス層の一部であってはならず、適切なプロジェクトに存在する必要があります。

+0

ありがとう、これは良い答えです。私は2つの答えをマークすることを願っています! – Josh

0

サービスをコンシューマから分離する方がよいでしょう。私たちの目標では、2つのレベルの分離があります。私たちは、すべてのサービスインターフェイスを1つのVisual Studioプロジェクトにまとめました。すべてのサービス実装は別のプロジェクトにグループ分けされています。 サービスのコンシューマは、2つのdllを参照する必要がありますが、ソリューションをより保守性と拡張性に優れています。私たちは複数のサービスを実装することができます。 サービスインタフェースは、インタフェースプロジェクトでWebSearchの契約を定義することができます。また、Google検索、Bing検索、Yahoo検索などのさまざまな検索サービスプロバイダを通じてWebSearchを複数実装することができます。

関連する問題