2013-07-05 14 views
5

ツール:Mvc4、Sqlサーバ、NhibernateMvc4:N階層アーキテクチャ

私はNtierアーキテクチャを学習しており、これを小さな例で学習する予定です。これは、 のフォームを持つ学生登録アプリケーションになります。ファーストネーム b。姓は です。c。アドレス d。学生番号 アプリケーションは にできます。 Idで学生を得る b。すべての生徒を取得 c。新しい学生を登録する/学生を救う d。学生を編集する e。私は、次の階層に

プレゼンテーション層(別々のプロジェクトMVC 4アプリケーション)

を持っていることを計画学生

を削除---学生のフォームのHTMLをここに。私はここでjqueryなどを使用することができます ---私のコントローラはサービスを呼び出します

サービスレイヤー(別々のプロジェクト:クラスライブラリプロジェクトこの場合、Webのみがクライアントになります)webAPIまたはwcfを使用する方法を学びます)別のプロジェクトでは、この後

---ここ

StudentService --- IstudentServiceここ

ビジネス層:(別々のプロジェクト:クラスライブラリプロジェクト) ?

データ層:(別プロジェクト:クラスライブラリプロジェクト) ??

データベース:(SQL Serverデータベース)

今、私は混乱してしまったし、私の質問は次のとおりです(?層)私は私の学生のモデルを作成します

  1. 何だろう私が持っているこの生徒の例のために、私は自分のビジネスレイヤーに書いています。

  2. データレイヤーにはどのようなものがありますか?どの方法を書いていますか? を直接データベースに伝達する方法ですか?

    いくつかの例が優れています。私は良いIOCコンテナを探します。ここで

は、以下のサンプルコードです:

public interface IStudentService 

    { 
     IEnumerable<Student> GetStudents(); 

     Student GetStudentById(int id); 

     void CreateStudent(Student student); 

     void UpdateStudent(Student student); 

     void DeleteStudent(int id); 

     void SaveStudent(); 
    } 

public class StudentService : IStudentService 
    { 
     private DataContext _datacontext; 
     public StudentService() 
     { 
      _datacontext = new DataContext(); 
     } 

     public IEnumerable<Student> GetStudents() 
     { 
      var students = _datacontext.Students; 
      return students; 
     } 

     public Student GetStudentById(int id) 
     { 
      return _datacontext.Students.Find(id); 
     } 

     public void CreateStudent(Student student) 
     { 
      _datacontext.Students.Add(student); 
      _datacontext.SaveChanges(); 
     } 

     public void UpdateStudent(Student student) 
     { 
      _datacontext.Entry(student).State = EntityState.Modified; 
      //_datacontext.Entry(student).State = EntityState.Modified; 
      _datacontext.SaveChanges(); 
     } 

     public void DeleteStudent(int id) 
     { 
      var student = _datacontext.Students.Find(id); 
      _datacontext.Entry(student).State = EntityState.Deleted; 
      _datacontext.SaveChanges(); 
     } 

     public void SaveStudent() 
     { 
      _datacontext.SaveChanges(); 
     } 
    } 

答えて

1

あなたはOnion Architectureの表情を持っている必要があります。これはMVCのバージョンでは古くなっていますが、層は大幅に階層化されています。

IoCコンテナに関しては、Autofacを参照することをおすすめします。コンベンションやマルチテナントの登録など、多くの機能を使いやすいです。ご質問については

:私は通常持っていることはフォーム送信である

、コントローラは、その後、私はStudentオブジェクトに変換し、コントローラに注入されIStudentRepositoryに引き渡すでしょう、StudentViewModelが提出さになるだろう。 IStudentRepositryはそれをDBContextに保存します。リポジトリインタフェースはドメイン層にありますが、リポジトリの実装はデータ層にあります。そして、DIコンテナは互いに一致します。

ドメイン層のすべてのインターフェイスと実装が必要な場所に配置されていることが、ここでのトリックです。また、ドメインレイヤーは他のレイヤーに依存してはいけません(ドメインプロジェクトはデータとWebプロジェクトへの参照を持っていません)。しかし、ウェブはデータとドメインの層に依存するでしょう。 IoCコンテナを設定するには、Webレイヤでデータレイヤの依存関係が必要です.Webレイヤが集約ルートであり、IoCをそこに設定する必要があります。しかし、操作のいずれかで直接Dataオブジェクトを使用しないでください。リポジトリまたはサービスのインタフェースを注入する必要があります。

階層化されたアーキテクチャについては多くのことが言われていますので、最初にオニオンアーキテクチャから始めてください。次に、必要なものについてより良いアイデアが得られます。

+0

私は、様々な記事が多くの知識を引き受ける傾向があるので、タマネギの建築はちょうど学ぶ人には良いことだとは思いません。 OAは伝統的なレイヤード3層を行った後の良い「第2ステップ」だと思います。 –

+0

IoCコンテナが言及されたので、私はある程度の知識を前提としていました。私はこれらのことを自分で覚えています。私は "古典的な" 3層のアプリの右の混乱を行いました。しかし、私がOAを試してみると、物事はちょうどいいところにあり、うまくいきました。 – trailmax

+1

はい、それはあなたがOAをあなたに理にかなった「正しい混乱」から多くを学んだという事実です。私は、OAが取り組む問題を学んでいないなら、OAは「これを言ったので、これをやってください」と感じています。 –

2
  1. データレイヤーでモデルを作成します。また、プレゼンテーション層にモデルを作成します(ビューモデル用)。あなたは通常、あなたのデータモデルとあなたのコントローラのプレゼンテーションモデルとの間にある種のマッピングを行います。

  2. シンプルなアプリケーションでは、ビジネスレイヤーが必要ないことがよくあります。特に、アプリケーションがフォームのデータをテーブルに保存するだけの場合。しかし、このようなアプリでは、「すでにこのクラスを完了していない限り、このクラスに登録することはできません」、「あなたはすでに許可されているクラス以上に登録していますか?ない。これらは、どこかで実施されなければならないビジネスルールであり、通常はビジネスレイヤーにあります。

  3. あなたのデータレイヤーはおそらくあなたのEntity Frameworkモデルです。モデルをロードしてデータベースに保存するのはあなたのコードです。

は、それは一般的に個人の好みの問題だ..私はNinjectが、他のもののような他の人が好き..多くのIoCコンテナがあります。

上記の説明は、単純なアプリケーションで行う方法です。より複雑なアプリケーションでは、ビジネスレイヤーにもモデルが存在する可能性があります。すべてがアプリケーションの複雑さと、データモデルレベルとは異なるビジネスレベルでデータを表現する必要があるかどうかによって異なります。

たとえば、ビジネスレイヤーにビジネスオブジェクトのリストがあるかもしれませんが、パフォーマンス上の理由からこれらのオブジェクトはデータレイヤーで異なって表されます。しかし、このすべては、現時点であなたが心配するべき事柄ではありません。アプリケーションがより複雑になるにつれて、さまざまなことを行う必要があることを理解してください。