将多个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调用(JumpsApiRequest
、KillsApiRequest
等)。我正试图将这些数据建模为一个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中提取并将它们放入属性中。
您可以进行以下实现:
-
使用一个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