1

我正在尝试对一系列复杂的 Api 调用进行建模,这些调用返回有关SolarSystemSolarSystemID. 不同的 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"/>
...

我有几个不同的 Api 调用类来进行单独的 Api 调用(JumpsApiRequest、、KillsApiRequest等)。我正在尝试将这些数据建模为一个SolarSystems类,该类将保存一Dictionary<int, SolarSystem>SolarSystem由它们索引的对象SolarSystemID

我能看到的唯一方法是创建SolarSystems一个static类(一次只能存在一个实例)并具有将返回我要求的特定信息的属性,如果信息是最新的,或者调用相应ApiRequest的来刷新信息,如果它不是最新的,然后返回最新信息。

我迷失的地方是,当信息来自不同的 Api 调用时,我不确定处理此问题的最佳方法。在我进行 Api 调用后,我可以遍历所有结果并使用 更新SolarSystems类索引的每个元素,SolarSystemID但这似乎效率很低。SolarSystems 的数量非常庞大。

我想知道我是否可以利用 Linq 的某些属性将其转换为类似数据库的场景,或者我是否会受益于创建数据库以在本地存储所有这些值?如果数据库是更好的方法,您推荐的解决方案是什么?

谢谢。

所有 Api Call 类都继承自基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

您可以进行以下实现:

  • 使用包含每个 ApiRequest 子类的实例的 SolarSystems 类。

  • SolarSystems 将具有生成所有 ApiRequest 并将结果数据聚合到属性中的逻辑Dictionary<int, SolarSystem>

  • 因为每个 ApiRequest 子类都有不同的过期时间。在 ApiRequest 类上创建一个事件,该事件将在缓存过期时触发,指示应更新 SolarSystems 实例上的数据。

  • SolarSystems 类应该订阅每个 ApiRequest 实例上的事件。

  • 为了轻松更新 SolarSystems 实例上的数据,SolarSystem 类可以具有与 ApiRequest 子类中包含的所有特定属性类似的结构。

一个例子:

您将拥有 ApiRequest 子类,该子类JumpsApiRequest将具有存储 jumps 的属性Dictionary<int, JumpsHelperClass>。并且 SolarSystem 类也将具有 type 的属性JumpsHelperClass。因此,当缓存过期事件触发时,它将以如下方式更新 SolarSystems 实例上的当前数据:

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

您可以使用 LINQ to XML 从结果中查询您需要的信息。链接到有关 LINQ to XML 的 MSDN 信息:http: //msdn.microsoft.com/en-us/library/bb387098.aspx

于 2013-02-10T20:28:44.450 回答