2010-11-30 5 views
5

私は次のように別れるC#MVCアプリケーション持っている: 表示 - >コントローラ - >サービス - >リポジトリサービスリファレンスを別のサービスレイヤに悪い習慣を渡していますか?

私は戻っ独自のビューモデルを持つ各ビューに薄いコントローラの練習を使用します関連するサービスから。

クイック例: ビュー:/ NewAppointment /ステップ1

そののcontrolerは次のようになります。

public ActionResult Step1() 
{ 
    return View(_appointmentService.Step1GetModel()); 
} 

そして予定のサービス層は、次のようになります。

public Step1Model Step1GetModel() 
{ 
    return new Step1Model(); 
} 

したがって私は、アプリケーションごとにいくつかの異なるサービスレイヤーを使用しており、それぞれ異なるインターフェイスを実装しています。

私の質問は、あるサービスレイヤを別のサービスレイヤとやりとりさせる必要があるときに発生します。この場合、サービスコールへのインタフェース参照を渡す方が良いでしょうか、コントローラがすべてのデータを収集して関連する結果をサービスに返すようにしなければなりませんか?

例:

は、私は、デフォルトでは、顧客の情報と私のビューモデルを投入してみたいと思います。私はこれを行うための参照2つの方法があります。

は...コードで

を任命サービスへの顧客インターフェースの参照を渡し、その後、予定のサービスは、顧客サービスにおける適切なGetCustomerメソッドを呼び出してみましょう:

private ICustomerService _customerService; 
private IAppointmentService _appointmentService; 

public ActionResult Step1() 
{ 
    var viewModel = _appointmentService.Step1GetModel(_customerService); 
    return View(viewModel); 
} 

OR

コントローラは、顧客を得るためのロジックを処理してみましょう、その後、予定のサービスにその結果を渡します。コードで

private ICustomerService _customerService; 
private IAppointmentService _appointmentService; 

public ActionResult Step1() 
{ 
    var customer = _customerService.GetCustomer(); 
    var viewModel = _appointmentService.Step1GetModel(customer); 
    return View(viewModel); 
} 

私はより良い練習になりますどのように引き裂かれています。最初のコントローラは、コントローラを素早く保ちますが、予定サービスと顧客サービスの間にサービス間の依存関係を作成します。 2つ目はコントローラにロジックを追加しますが、サービスは完全に独立しています。

誰にでもより良い方法があると思っていますか?

感謝〜

答えて

6

彼の純粋に概念的に私はあなたがあなたのservicesview modelsについて何を知っていることは理にかなっているとは思わない考えます。まずコントローラを持つ主な理由の1つは、ビューロジックをビジネスロジックから切り離すことですが、サービスがビュー固有のデータを返す場合、それらは本質的にビジネスロジックに結びついています。

理想的には、私はこの方法は、このように見えるように期待したい:より直接的にかかわらず、あなたの質問に答えるために

public ActionResult Step1() 
{ 
    var customer = _customerService.GetCustomer(); 
    var appointment = _appointmentService.GetAppointmentFor(customer); 

    var viewModel = new Step1ViewModel(customer, appointment); 

    return View(viewModel); 
} 

、私はそれがお互いを知って、あなたのサービスのためにいいのよ、彼らはの一部だと思います同じ概念的な層。また

、もう一つ...

あなたはパラレルクラス階層何持つサービス、リポジトリおよびコントローラとの多くを持っているようですね。それはのような何かを行うに作業パターンの単位と強力なORMのようなものを使用する方が理にかなってあります:すべての後に

public MyController(IUnitOfWork unitOfWork)... 

public ActionResult Step1() 
{ 
    var customer = unitOfWork.Find<Customer>(); 
    var viewModel = new Step1ViewModel(customer.Appointment); 
    return View(viewModel); 
} 

を、あなたのアプリケーションの価値はないサービスでは、モデルです。

+0

コメントを評価してください。 – TheRightChoyce

+0

おっとり、間違いを入力してください。私は "ダム"ビューモデルの原則に従ってきました。ほとんどの人はコンストラクタを持っていないし、コンストラクタを持っていないという点でもそうです。しかし、このように提示すると、コンストラクタを追加してから、AutoMapperなどを使用して関連するドメインレイヤ情報を取得するというロジックが見えます。私はドメインマッピングのすべてのビジネスがどこに行くのかについて内部的な討論をしていますが、ダムビューモデルと物事コントローラーのアイデアに固執しています。 – TheRightChoyce

+0

これはまさにですオートマッパーが作られたシナリオ。私は助けになることができてうれしいです。 – jonnii

関連する問題