1

SolarSystemで識別される単一のエンティティに関するさまざまな情報を返す複雑な一連のApi呼び出しをモデル化しようとしていSolarSystemIDます。さまざまなApi呼び出しがに関する情報を返していますがSolarSystem、1回のApi呼び出しですべての情報を取得できるわけではありません。

データ例:

<eveapi version="2">
  <currentTime>2013-02-10 19:30:31</currentTime>
  <result>
    <rowset name="solarSystems" key="solarSystemID" columns="solarSystemID,shipJumps">
      <row solarSystemID="30004995" shipJumps="100"/>
      <row solarSystemID="30001746" shipJumps="3"/>
      <row solarSystemID="30004972" shipJumps="2960"/>
...

と:

<eveapi version="2">
  <currentTime>2013-02-10 19:02:37</currentTime>
  <result>
    <rowset name="solarSystems" key="solarSystemID" columns="solarSystemID,shipKills,factionKills,podKills">
      <row solarSystemID="30000750" shipKills="0" factionKills="61" podKills="0"/>
      <row solarSystemID="30034971" shipKills="0" factionKills="113" podKills="0"/>
      <row solarSystemID="30003049" shipKills="0" factionKills="195" podKills="0"/>
...

JumpsApiRequest個々のApi呼び出し( 、、KillsApiRequestなど)を行うためのいくつかの異なるApi呼び出しクラスがあります。このデータを、によってインデックス付けされたオブジェクトのコレクションをSolarSystems保持する1つのクラスにモデル化しようとしています。Dictionary<int, SolarSystem>SolarSystemSolarSystemID

私が見ることができる唯一のアプローチはSolarSystemsstaticクラスを作成し(一度に1つのインスタンスのみが存在できます)、情報が最新であるかどうかを尋ねる特定の情報を返すプロパティを持つか、対応するものを呼び出してApiRequest情報を更新することです。最新ではない場合は、最新の情報を返します。

私が迷っているのは、情報がさまざまなApi呼び出しからのものである場合にこれを処理する最善の方法がわからないということです。Api呼び出しを行った後、すべての結果を繰り返し処理し、SolarSystemsクラスの各要素のインデックスを更新することができましたSolarSystemIDが、これは非常に非効率的です。ソーラーシステムの数は非常に多いです。

Linqのいくつかのプロパティを利用して、これをデータベースのようなシナリオに変換できるかどうか、またはこれらすべての値をローカルに格納するデータベースを作成することでメリットが得られるかどうか疑問に思っています。データベースがより良いアプローチである場合、あなたの推奨する解決策は何ですか?

ありがとう。

すべてのApiCallクラスは、基本ApiRequestクラスを継承します。抽象ApiRequestクラスは以下を実装します:

    public DateTimeOffset TimeRequested { get; set; }
    public DateTimeOffset CachedUntil { get; set; }
    public List<Parameter> Parameters { get; set; }
    protected XDocument Results { get; set; }
    protected static string _Host;
    private Uri CombinedUri { get; set; }

    private void CombineUri()
    public virtual void MakeRequest()
    protected virtual void ParseResults()

各サブクラスには、特定のApi呼び出しの結果に対応するプロパティがありParseResults、xmlから抽出してプロパティに配置するオーバーライドされたメソッドを実装します。

4

2 に答える 2

1

LINQ to XMLを使用して、結果から必要な情報をクエリできます。LINQ to XMLに関するMSDN情報へのリンク:http://msdn.microsoft.com/en-us/library/bb387098.aspx

于 2013-02-10T20:28:44.450 に答える
1

次の実装を行うことができます。

  • すべてのApiRequestサブクラスのインスタンスを保持するSolarSystemsクラスを使用します。

  • SolarSystemsには、すべてのApiRequestを作成し、結果のデータをプロパティに集約するロジックがありますDictionary<int, SolarSystem>

  • 各ApiRequestサブクラスには、異なる有効期限があるためです。キャッシュの有効期限が切れたときに発生するイベントをApiRequestクラスに作成し、SolarSystemsインスタンスのデータを更新する必要があることを示します。

  • SolarSystemsクラスは、すべてのApiRequestインスタンスでイベントをサブスクライブする必要があります。

  • SolarSystemsインスタンスのデータを簡単に更新するために、SolarSystemクラスは、ApiRequestのサブクラスに含まれるすべての特定のプロパティと同様の構造を持つことができます。

例:

JumpsApiRequestジャンプを格納するプロパティを持つApiRequestサブクラスがありますDictionary<int, JumpsHelperClass>。また、SolarSystemクラスにもタイプのプロパティがありますJumpsHelperClass。したがって、キャッシュの有効期限イベントが発生すると、SolarSystemsインスタンスの現在のデータが次のように更新されます。

//MasterCollection  Dictionary<int, SolarSystem>
foreach (int item in MasterCollection.Keys)
{
    MasterCollection[item].Jumps  = JumpsApiRequestInstance.Jumps[item];
}
于 2013-02-11T00:21:22.130 に答える