2012-01-26 8 views
0

リポジトリの例では、セッションが開かれたときにリポジトリがインスタンス化されているように見えます。コントローラのアクションでは、データレイヤーはリポジトリへの呼び出しを介してアクセスされます。これは一般的なプラクティスですか?アクション要求ごとに必要に応じてリポジトリをインスタンス化する方が理にかなっていますか?リポジトリをグローバルに保持するのが一般的な方法ですか?

編集:より正確なシナリオ。

public class myController : Controller { 
    IMyRepository myRepository; 

    public myController(IMyRepository repositoryParam){ 
    myRepository = repositoryParam; 
    } 

    public ActionResult someAction(){ 
    MyClass myClass = myRepository.RepositoryAction(); 
    } 
} 

このシナリオでは、myRepositoryはmyControllerに対してグローバルです(注:これはSteven Sandersonの例に基づいています)。すべてのコントローラがアクセスできるように定義されているのがわかりましたが、これは単純で正確な例です。この例では、リポジトリは、使用ごとにではなく、グローバルに使用されるのはなぜですか?

+0

リポジトリはかなり広い概念です。あなたはあなたの質問から何らかの意味を理解するために、あなたの正確なシナリオをはるかに具体的な方法で定義しなければなりません。 –

+0

@DarinDimitrovより正確なシナリオで編集されました。 –

+0

@DarinDimitrov - (リポジトリパターンを使用してデータレイヤーにアクセスする)多くのASP.NET MVCの例に示すように、彼がリポジトリを参照していると仮定しています。通常、これらの例では、具象リポジトリオブジェクトがEFを介してデータベースにアクセスしています。 – JasCav

答えて

2

あなたの質問に答えるには、Repository Patternで少し読んでください。このパターンは、以下を含む多くの利点を提供するために使用されます。

  • データロジックまたはWebサービスアクセスロジックを集中管理します。
  • これは単体テストの代替点を提供します。
  • これは、アプリケーションの全体設計が進化するにつれて適応できる柔軟なアーキテクチャを提供します。

質問:「これは一般的な対応ですか?」答えは「それはあるべきだ」残念ながら、私はそれが私が好むほどには見ません。

ここでは、作成したリポジトリをコントローラクラスのコンテキスト内に表示します。グローバルはオブジェクトがどのスコープからでもアクセス可能であることを意味します。hereウィキペディアで

いずれにしても利点の1つは、リポジトリが、リポジトリの正確で具体的なバージョンを使用して、データにアクセスする方法(またはデータにアクセスする場所)を変更できるようにすることです。したがって、あなたは持っているかもしれません:

  • IRepository - 具体的なリポジトリが実装するあなたのインターフェイス。
  • DatabaseRepository - データベース内のデータにアクセスします。
  • FlatFileRepository - フラットファイルからデータにアクセスします。
  • など

あなたが他のデータソースへの切り替えをご希望の場合、それはあなたのコントローラ内で具体的な実装をスワップアウトするように簡単です。 (dependency injectionでこれを行うためのより高度で柔軟な方法がありますが、それはこの質問の範囲外ですが、リポジトリパターンに大きく影響されます)

いずれにしても、プロジェクトチームは「ねえ、私たちはすべてのデータをフラットファイルに保存するからデータベースを使用するように切り替えるつもりだ」と決めます。もしあなたがあなたのコード全体で特定のリポジトリのインスタンス化を散らばっていれば、今はリポジトリパターンの利点をやや否定して、修正と更新の分野がたくさんあります。しかし、コントローラのメンバリポジトリを宣言することで、FlatFileRepositoryからDatabaseRepositoryに切り替え、新しいリポジトリを実装するだけで完了です!チームの皆さんは幸せです!

更新:「なぜクラス変数をインスタンス化するのですか?」

この質問に答えるには、2つのオプションを考えなければなりません。最初の選択肢は、メモリ内に比較的小さなオブジェクトを保持できるということです。もう1つの選択肢は、ユーザーがアクションの1つにアクセスするたびに新しいオブジェクトをインスタンス化して新しいメモリを割り当て(オブジェクトが入っているスコープを離れるときに割り当てを解除する)ことができ、あなたのウェブアプリケーションをホストしているサーバー。

ウェブサイトがどのように使用されているかを考えると、ユーザーは頻繁にその行動に当たっています。あらゆる行動はあなたのウェブサイトの一部を表しています。リポジトリが必要なたびにインスタンス化すると、実際に必要とされるよりもはるかに大きな作業負荷をサーバに与えることができます。特に、サイトの規模が大きくなるほどで​​す。 (私は他の人が、チュートリアルに示されている方法と個々のアクションのインスタンス化とをやりたい理由を考えることができると確信しています)。私は上で述べた。これは、「変更の効率」または保守性を向上させることです。

あなたの質問へのより良い回答に役立つ希望!

+0

深い答えをありがとうございます。簡単な例では、リポジトリがコントローラのコンテキストで使用されていると私は気付きました。しかし、私はそれらがglobal.asaxのApplicationStartセクションで使われているのを見ました。要点に戻ると、私の主な質問は、なぜこのコントローラーでさえも、リポジトリー全体が長い間保持されるのかを理解することでしたか?この場合、コントローラの寿命の全体にわたってリポジトリを保持することは、私にとって(たとえ数行のコードを保存してデータレイヤ接続を簡単に変更しても)効率的ではないようです。 –

+0

私はリポジトリパターンで行ったすべての読書から、それは常に単一の要求を超えてキャッシュされているようです。これはベストプラクティスとは思われません。 –

+0

@TravisJ - アップデートを行った。うまくいけば、あなたの質問にうまく答えるのに役立ちます。 – JasCav

関連する問題