2012-04-13 14 views
2

現在、エンティティフレームワークを使用している間、ASP.NET MVC 4で作業しています。私の前にMVCで働いたことがありませんし、次の層でプロジェクトをビルドします:モデルにアクセスするMVCビジネスロジック

  • GUI(モデル、ビュー、コントローラ、...)
  • は、DAL(エンティティデータベースとリポジトリ+私のクエリとIRepository)
  • BL()
  • COMMON
  • WCF
  • テスト

ここで、GUIレイヤのモデルを使用するBLにクエリを書き込もうとしています。単にGUIを参照することはできないので、私は実際にここで何をすべきか分かりません。私が言ったように

public static List<PSNAdres> GetAdres(IZoekRepository repo) 
{ 
    List<PSNAdres> lijstTypes = (from t in repo.PSNAdres 
         select new PSNAdres {t.Gemeente, t.Straat, t.Postcode}).ToList(); 

    return lijstTypes; 
} 

:私のBLで

は、ここで私はにしようとしているものとはコードだ私はMVCに新しいです。このレイヤーレイアウトは、MVCスペシャリストが使用するように指示したものです。

+2

ここでは、用語の確認が必要な場合があります。 GUIは 'Views'(またはView-Model)を扱うべきですが、モデルは直接扱わないでください。 – dougajmcdonald

+0

一般にあなたのBL(ドメイン)はドメインオブジェクトのみを扱うべきです。 GUI(ビュー)が必要な場合モデルはGUIレイヤー(またはその唯一の目的のレイヤー)でその変換を行います。 –

+0

私のGUIが持っているものに関するいくつかの追加情報を追加しました – whodares

答えて

2

あなたが求めるものはわかりませんが、私の答えはここにあります。アドレスリストを提示するための簡単なシナリオ:

ビューモデル:

public class AddressListViewModel 
{ 
    public List<AddressViewModel> AddressList { get; set; } 
    public bool CanAdd { get; set; } 
} 

public class AddressViewModel 
{ 
    public string Country { get; set; } 
    public string City { get; set; } 
    public string Street { get; set; } 
    public bool CanEdit { get; set; } 
    public bool CanDelete { get; set; } 
} 

BL:

public class AddressController : BaseController 
{ 
    public ActionResult List() 
    { 
     var addressList = blObject.GetAddressList(); 
     var model = new AddressListViewModel(); 
     model.AddressList = addressList.Select(a => 
      new AddressViewModel 
      { 
       Country = a.Country.Name, 
       City = a.City, 
       Street = a.Street, 
       CanDelete = ...check user access here..., 
       CanEdit = ...check user access here... 
      }); 

     model.CanAdd = ...check user access here... 

     return View(model); 
    } 
} 
+0

ここに答えてくれてありがとうございます。しかし、私は今働きたいと思っています。 GUI、BL、DAL、...はすべて異なるプロジェクトにありますが、同じソリューションファイルにあります。 BLからGUIへの参照が許可されていないので、私はそれを修正する方法を探しています。現在のところ、BL(BLプロジェクト内)は自分のPSNAdresモデル(GUI)にアクセスできないため、これを修正する方法を探しています。 – whodares

+0

@ThomasSchellekens:PSNAdresはどのようにGUIにありますか? PSNAdresはデータベーステーブルを表しているのか、プレゼンテーションの目的で作成されたクラスなのですか。最初の場合、それはGUIにあってはなりません。 – LukLed

+0

DALに自分のデータベース(ビュー)を取得しました。次に私はそれをリポジトリに入れ、私のBLに行きます。そこでは、PSNAdres(GUIのモデル)を使用して、特定の列を自分のビューからPSNAdresにマップします。私はMVCについて言えば、ターミナル・リージョンについてはわからないので、正しく説明することを願っています。 – whodares

1

public static List<Address> GetAddressList()//Doesn't take repository here, repositories are injected in constructor 
{ 
    return adresRepo.PSNAdres.ToList(); 
} 

コントローラーはあなたのGUI層が提供する機能のほんの消費者であります他の層。

その結果、モデルに問題があることが原因です。プロジェクトをレイヤーに分割する場合は、モデルを移動する必要があります。

Visual Studioで作成されたデフォルトプロジェクトでは、GUIプロジェクトをレイヤーに分割しない場合のGUIレイヤーのモデルしかありません。つまり、初心者です。これはMVCのアプローチとは関係ありません。レイヤーを分割するときは、モデルを「ドメインレイヤー」に移動する必要があります(下記参照)。

したがって、あまりにも煩わされることなく、モデルをGUIレイヤーから移動してください。あなたのデザインよりも

より実用的なアプローチは、スティーブ・サンダーソンとアダム・フリーマン(プロASP.NET MVC 3.0フレームワーク、プレスカンファレンス[バージョン4のための本がまだ出ていない])が提唱するドメイン設計に従うことであろう。これはあなたのデザインに似ていますが、より実用的です。このアプローチでは、細部まで説明することなく、モデルと事業層をドメインプロジェクトに分けます。それははるかに実用的なデザインを提供します。

そうする具体的な要件がない限り、私はWCFもおそらく残念だと思います。 MVCは、必要な場所でサービス指向のアプローチを提供するように設計されています。

私はS SandersonとA Freemanの本を読むことをお勧めします。それはあなたに多くの苦痛を惜しまないでしょう。

+0

+1の書籍の参考に、それらの人を愛して! – dougajmcdonald

関連する問題