【问题标题】:Modeling Multiple Api Calls into 1 object (Data Structures)将多个 API 调用建模为 1 个对象(数据结构)
【发布时间】:2013-02-10 19:55:09
【问题描述】:

我正在尝试对一系列复杂的 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&lt;int, SolarSystem&gt; 集合。

我能看到的唯一方法是使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 调用结果的属性,并实现了一个重写的 ParseResults 方法,该方法从 xml 中提取并将它们放入属性中。

【问题讨论】:

  • 您能否展示其中一个 API 调用类的示例?它们是从 SolarSystem 继承的吗?
  • @Mt.Schneiders 查看编辑。
  • 你怎么知道应该处理/解析特定 XML 的 ApiRequest 子类是什么?
  • @Mt.Schneiders 每个子类都实现一个 Api 调用。它的构造函数需要其 Api 调用的相应参数,并且它公开特定于该特定调用结果的属性。子类负责构建提供给它们的参数列表,基类使用任意列表来构建 URL、发出请求并存储 xml。然后,子类将 XML 解析为它们的外向属性。这有意义吗?
  • 是的,恐怕是的!因此,您有几个 ApiRequest 子类,每个子类都有其特定属性,这些属性在抽象类发出请求时填充。现在,您想知道在发出所有请求后保持 ApiRequest 子类属性的最佳方式是什么?

标签: c# xml database data-structures


【解决方案1】:

您可以进行以下实现:

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

  • SolarSystems 将具有生成所有 ApiRequest 并将结果数据聚合到属性 Dictionary&lt;int, SolarSystem&gt; 中的逻辑。

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

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

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

一个例子:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-24
      • 2010-12-19
      • 2014-09-15
      • 1970-01-01
      • 2019-02-04
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多