将多个Api调用建模为一个对象(数据结构)

本文关键字:一个对象 数据结构 建模 Api 调用 | 更新日期: 2023-09-27 17:58:39

我正在尝试对一系列复杂的Api调用进行建模,这些调用返回关于由SolarSystemID标识的单个实体SolarSystem的不同信息。不同的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调用(JumpsApiRequestKillsApiRequest等)。我正试图将这些数据建模为一个SolarSystems类,该类将包含由其SolarSystemID索引的SolarSystem对象的Dictionary<int, SolarSystem>集合。

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

我迷失的地方是,当信息来自不同的Api呼叫时,我不确定处理这一问题的最佳方式。在我调用Api之后,我可以迭代所有结果,并用SolarSystemID更新SolarSystems类索引的每个元素,但这似乎真的很低效。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调用结果的属性,并实现了一个overriden ParseResults方法,该方法从xml中提取并将它们放入属性中。

将多个Api调用建模为一个对象(数据结构)

您可以进行以下实现:

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

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

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

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

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

一个例子:

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

//MasterCollection  Dictionary<int, SolarSystem>
foreach (int item in MasterCollection.Keys)
{
    MasterCollection[item].Jumps  = JumpsApiRequestInstance.Jumps[item];
}

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