3

私はRepository自分のアプリにそれを実装するためのパターンを理解しようとしています。そして、私は何らかの形でそれに固執しています。

アプリがデータにアクセスする方法の簡略化されたアルゴリズムは次のとおりです。

  1. 最初は、アプリにデータがありません。このデータを取得するには、Webサービスに接続する必要があります。WebServiceRepositoryしたがって、Webサービスとの対話のすべての低レベルのロジックは、クラスの背後に隠れています。Webサービスからアプリに渡されるすべてのデータがキャッシュされます。

  2. 次回アプリがデータを要求するときに、このデータはWebサービスから要求する前にキャッシュで検索されます。キャッシュはそれ自体をデータベースおよびXMLファイルとして表し、。を介してアクセスされますCacheRepository

    キャッシュされたデータは、有効(ユーザーに表示可能)、無効(表示できない古いデータ)、および部分的に有効(表示可能ですが、できるだけ早く更新する必要があります)の3つの状態になります。

    a)キャッシュされたデータが有効な場合は、それらを取得した後、停止できます。

    b)チャッキングされたデータが無効または部分的に有効な場合は、にアクセスする必要がありますWebServiceRepository。Webサービスへのアクセスが正常に終了すると、要求されたデータがキャッシュされ、ユーザーに表示されます(これは、への2回目の呼び出しとして実装する必要があると思いますCacheRepository)。

    c)したがって、データアクセスのエントリポイントはCacheRepositoryです。Webサービスは、完全に有効なキャッシュがない場合にのみ呼び出されます。

キャッシュを検証するロジック(有効/無効/部分的に有効)をどこに配置すればよいかわかりませんか?どこに電話をかけるWebServiceRepositoryか?RepositoriesSOLIDの単一責任原則(SRP)に違反しているため、このロジックを誰にも配置できないと思います。

ある種の実装をRepositoryServiceして、すべてのロジックをその中に入れる必要がありますか?または多分リンクする方法はありWebServiceRepositoryますWebServiceRepositoryか?

それを実装するためのパターンとアプローチは何ですか?

もう1つの質問は、キャッシュから部分的に有効なデータを取得し、1つのメソッドの呼び出しでWebサービスを要求する方法です。デリゲートとイベントを使うと思います。他のアプローチはありますか?

アドバイスをお願いします。上記のすべての機能をリンクする正しい方法はどれですか?

PS多分私は少し紛らわしいことをすべて説明しました。必要に応じて、いくつかの追加の説明をすることができます。

PPS Under CacheRepository(およびunder WebServiceRepository)は、リポジトリのセットを意味します-CustomerCacheRepositoryなどProductCacheRepository。コメントをありがとう@hacktick。

4

1 に答える 1

5

Webサービスでさまざまなエンティティのcrudメソッドが提供されている場合は、entityrootごとにリポジトリを作成します。顧客がいる場合は、CustomerRepositoryを作成します。子として添付ファイルのあるドキュメントがある場合は、プロパティとして添付ファイルのあるドキュメントを返すDocumentRepositoryを作成します。

リポジトリは、特定のタイプのエンティティ(つまり、顧客またはドキュメント)に対してのみ責任があります。リポジトリは、キャッシングなどの「横断的関心事」には使用されません。(つまり、CacheRepositoryの例)

すべてのリポジトリにIDataCacheインスタンスを注入します(つまり、StuctureMap)。

Repository.GetAll()を呼び出すと、現在のリポジトリのすべてのエンティティが返されます。すべてのエンティティがキャッシュに登録されます。キャッシュ内のそのオブジェクトのIDに注意してください。

Repository.FindById()を呼び出すと、最初にキャッシュでIDがチェックされます。オブジェクトが有効な場合は、それを返します。

オブジェクトの無効化に関する通知は、キャッシュにルーティングされます。クライアント側の無効化を実装したり、メッセージキューなどを介してサーバーからクライアントにメッセージをプッシュしたりできます。

オブジェクトが現在有効であるかどうかのステータスに関する情報は、エンティティオブジェクト自体に保存するのではなく、キャッシュにのみ保存する必要があります。

于 2012-08-08T11:36:33.370 に答える