【发布时间】: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 调用(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 调用结果的属性,并实现了一个重写的 ParseResults 方法,该方法从 xml 中提取并将它们放入属性中。
【问题讨论】:
-
您能否展示其中一个 API 调用类的示例?它们是从 SolarSystem 继承的吗?
-
@Mt.Schneiders 查看编辑。
-
你怎么知道应该处理/解析特定 XML 的 ApiRequest 子类是什么?
-
@Mt.Schneiders 每个子类都实现一个 Api 调用。它的构造函数需要其 Api 调用的相应参数,并且它公开特定于该特定调用结果的属性。子类负责构建提供给它们的参数列表,基类使用任意列表来构建 URL、发出请求并存储 xml。然后,子类将 XML 解析为它们的外向属性。这有意义吗?
-
是的,恐怕是的!因此,您有几个 ApiRequest 子类,每个子类都有其特定属性,这些属性在抽象类发出请求时填充。现在,您想知道在发出所有请求后保持 ApiRequest 子类属性的最佳方式是什么?
标签: c# xml database data-structures