[英]elegant solution for mapping one string value to another
我正在使用多个外部系统,所有这些系统都返回一个状态属性。
此状态属性可以是外部系统之间的不同值,但必须映射到系统上的特定状态值。
我有一个单独的类(适配器)来处理每个外部系统
例如
我的系统的状态值是
{Pending,Booked,Arrived,InProgress,Complete}
现在, 外部系统A可能具有以下值
{Unknown,Pending,Booked,Accepted,Arrived,POB,Complete}
外部系统B可能具有以下值
{Waiting,Booked,Arrived,InProgress,Complete}
等等
现在我需要将外部系统值映射到我的系统值。
例如。
对于外部系统A.
未知,待定 - >待定
已预订,已接受 - >已预订
到了,POB - > InProgress
完成 - >完成
对于外部系统B.
等待 - >等待
预订 - >预订,
到了,InProgress - > InProgress
完成 - >完成
现在我已经将它抽象为一个辅助方法MapState,每个适配器使用它来获取状态值。 此方法具有字符串参数externalsystem和externalsystemstate,并使用switch语句将外部系统状态映射到我的系统状态。
我认为这非常简单,我相信有更优雅的解决方案
有什么建议么?
听起来你需要一个Dictionary
来进行有效的查找:
var mappingA = new Dictionary<string, string>()
{
{ "Unknown", "Pending" },
{ "Pending", "Pending" },
{ "Booked", "Booked" },
{ "Accepted", "Booked" },
{ "Arrived", "InProgress" },
{ "POB", "InProgress" },
{ "Complete", "Complete" }
};
...然后您的映射函数可以引用相应的字典:
public string MapState(IDictionary<string, string> mapping, string externalState)
{
return mapping[externalState];
}
从而:
var state = MapState(mappingA, "Accepted");
......将返回“预订”。
当然,如果外部状态不在预期值列表中,您需要处理应该发生的事情等。
我想你也可以通过从映射字典中排除“标准”值来节省一些重复,如果输入不是那些标准值之一,则只能求助于字典。 也许使用Hashtable
。
不过,我认为我很想使用enum
来表示已解析的值。 这样,在测试状态时,下游代码中的字符串操作较少。 您可以在需要时使用ToString()
轻松转换回字符串。
我之前使用的一种方法是创建XML映射文件,这些文件在运行时加载,然后用于将一个值映射到另一个。 例如,您可以:
<Input Name="Unknown">
<Output>Pending</Output>
</Input>
<Input Name="Pending">
<Output>Pending</Output>
</Input>
<Input Name="Waiting">
<Output>Pending</Output>
</Input>
这将处理一个映射到'待定'的情况,这也具有可以由非技术用户在程序外更改的优点。 缺点是您需要知道所有可能的传入类型,以便为它们创建映射。
在您的代码中,您可以使用XML解析器加载映射,然后查找传入的字符串并查找正确的属性并输出内部值。
你需要
enum State { Pending, Booked, Arrived, InProgress, Complete }
出于任何一个:
enum StateA { Unknown, Pending, Booked, Accepted, Arrived, POB, Complete }
enum StateB { Waiting, Booked, Arrived, InProgress, Complete }
然后它就像转换方法一样简单(不是真正的映射):
State Convert(StateA a)
{
switch(a)
{
case StateA.Unknown:
case StateA.Pending:
return State.Pending;
...
}
}
State Convert(StateB b)
{
...
}
在使用State
的相同范围内定义这些方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.