2016-06-13 1 views
0

MVC 5 Webアプリケーションの自動スキャナーのコントローラーでDependency Injectionを使用する方法を学習しようとしています。私が "Dependency Injection"と "Unity"についてのチュートリアルを見つけている間、私が見てきた例は、より多様な世界の多様性であり、実際にコントローラのデータベースコンテキストを扱うことは決してありません。リポジトリなしのDbContextの依存性注入

私が言っていることのより良い例を得るために、ここには私が持っているものと私がしようとしているもののコードスニペットがあります。

Visual Studioを使用して、 "Entity Frameworkを使用してビューを持つ"コントローラを自動スキャナーで作成すると、これは通常作成されるものです。

public class TideUploadsController : Controller 
    { 
     // This is the EF Database context placed by the auto-scaffolder 
     private AzMeritContext db = new AzMeritContext(); 

     [HttpGet] 
     public ActionResult Index() 
     {    
      return View(db.TideUploads.ToList()); 
     } 

     /* further CRUD ActionResults not shown */ 

    } 
} 

私は依存性の注入を使用するように、これまでに読んだものから、私の代わりに、クラスのインターフェースを呼び出すコンストラクタを使用する必要があります。私は、Entity Frameworkの周りのリポジトリをラップすることについてのさまざまなレビューを読んだ。リポジトリを使用せずにこれを実行できるかどうかを確認したいと思います。

auto-scaffolderによってコードに配置されたDbContextの代わりに使用する既存のインターフェイスはありますか?

// This is the EF Database context placed by the auto-scaffolder 
    private AzMeritContext db = new AzMeritContext(); 

    public TideUploadsController(/* what Interface goes here? */) 
    { 
     //db = ? 
    } 

これは、本当にEntity Framework dbContextの周りにリポジトリをラップする必要がある状況ですか?

は、私は本を読み、チュートリアルやビデオを検索、最後の数週間を費やしている、と私はまだのようなものを示し、ステップバイステップの例を見ていない:

  • ステップ1:コントローラを取りますあなただけの自動足場
  • ステップ2:これを行う...
  • ステップn:そして今あなたのコントローラーは密接に結合されているのではなく、データベースのコンテキストと疎結合しています。

答えて

1

まあ、私にとっては依存性注入の背後にある利点の一つは、あなたが基本的にmockableオブジェクトまたは他の実装にあなたの「依存関係」をデカップリングされ、私見リポジトリパターンは行くための一般的な方法であるということです、私は表示されませんラッパーを使用してコンテナ内のインターフェイスと実装をコンフィグレーションする必要があるその他の方法

私はあなたがコンセプトに精通していると思います:

public class UserRepository:IUserRepository 
{ 
    public UserRepository(){ 
    // you usually instanciate your context here 
    // private AzMeritContext db = new AzMeritContext(); 
    } 
    User GetUserById(int Id){ 
    // do your query to get a single user 
    } 
} 

このimplementationは私にはOKに見えます。

その後、あなたのコントローラは、次のようになります。

public class TideUploadsController : Controller 
     { 

      public TideUploadsController(IUserRepository userRepository){ 
       // constructor injection 
       // assign your user repository to a local variable outside of the constructor scope something like _userRepository 
      } 

      [HttpGet] 
      public ActionResult Index() 
      {    
       return View(_userRepository.GetUserById(1)); 
       // let's assume your variable's name is _userRepository 
      } 

      /* further CRUD ActionResults not shown */ 

     } 
    } 

はちょうど私の2セント

など、あなたのインターフェイスは、あなたが、あなたのコントローラでサービスを使用して公開したいメソッドを実装する必要があることを覚えておいてください私はそれが助けてくれることを望みます

+0

リポジトリのすべての議論について、私がまだ見ている欠点は、余分なタイピングがたくさんあることです。私はジェネリックリポジトリインタフェースの例を見つけましたが、ジェネリックリポジトリをまだ見ていないので、コンストラクタにコンテキストとモデルのペアを挿入して、同じ動詞(get、insertなど)を使用できます。本当に汎用リポジトリに関するアイデアはありますか? –

+0

おそらく、 "ジェネリックリポジトリ"を作成してコンストラクタにDBContextを注入する必要があります。このアイデアは私にとっては確かです。http://blog.gauffin.org/2013/01/repository-pattern-done-right/任意のデータベースアクセスをラップするために記述して入力するコードがたくさんあるとします –