2011-10-09 6 views
1

I持って、次のリポジトリクラス:それは正しいアーキテクチャそれはASP.NET MVC&EFアプリの正しいアーキテクチャですか?

public class TestController : Controller 
{ 
    private Model1Repository _repository; 

    public TestController() 
    { 
     _repository = new Model1Repository(); 
    } 
    public ActionResult Tagedit() 
    { 
     return View(_repository.GetDataFromDB1()); 
    } 

    public ActionResult Avatar() 
    { 
     return View(_repository.GetDataFromDB2()); 
    } 
} 

です:コントローラ次

public class Model1Repository 
{ 
    private NEOGOV_IdeasEntities _dataContext; 
    public Model1Repository() 
    { 
     _dataContext = new NEOGOV_IdeasEntities(); 
    } 
    public IdeaType IdeaType(int ID) 
    { 
     var q = from i in _dataContext.IdeaTypes where i.ID == ID select i; 
     return q.FirstOrDefault(); 
    } 
    ... rest methods.... 
} 

?か否か?私の場合、_repository変数は各リクエストごとに作成されます。

+0

動作しますか?はい。いいですか?いいえ、あなたはDependency Injectionを使うべきです:Dependency Injection with Ninjectを見てください。セットアップは非常に簡単です。 – Dismissile

答えて

1

個人的には、コンポーザーではなくコントローラのアクションでリポジトリをインスタンス化します。すべてのコントローラのアクションがリポジトリを必要とすると肯定的であれば十分ですが、コントローラの操作はUIの操作に関係しているため、コントローラメソッドを必要としないコントローラメソッドを持つことはまれではありません。

しかし、それは実際には終日のスタイルのことです(おそらく、多少のパフォーマンスのオーバーヘッドがあります)。あなたがそのようにしたいならば、気軽に!

+0

あなたはシングルトンとして_repositoryについて以下に書いています。それは理にかなっている? –

+0

あなたの実装では、_リポジトリはシングルトンではありません。接続プーリングを利用するには、データコンテキストをすばやく解放する必要があります。あなたの_repositoryがコントローラアクションの後でガベージコレクションされるという事実は、それが起こるのを助けますが、シングルトンパターンを使用することは役に立ちません。リポジトリを必要に応じて作成し、できるだけ早くリリースすることで、効率がさらに向上し、スケーラビリティが向上します。 –

-2

アーキテクチャ全体では答えられませんが、1つだけのリポジトリが存在しますモデル1リポジトリオブジェクトは1つではなく、TestController用にインスタンス化されています要求(HTTP要求)。

+1

なぜですか?デバッガは、各要求に対するコントローラのコンストラクタを呼び出します。 CtorはModel1Repositoryの新しいコピーを作成し、Model1RepositoryのctorはNEOGOV_IdeasEntitiesの新しいコピーを作成します。したがって、各要求はNEOGOV_IdeasEntitiesの新しいコピーを作成します。 –

+2

コントローラのデフォルトの有効期間はリクエストごとで、_repositoryはシングルトンではないため、毎回新しいものが作成されます。 –

関連する問題