我正在使用多个外部系统,所有外部系统都返回一个状态属性。
此状态属性在外部系统之间可以是不同的值,但必须映射到系统上的特定状态值。
我有一个单独的类(适配器)来处理每个外部系统
e.g
我的系统的状态值是
{ 待定, 预订, 赶到时, 进行中, 完成 }
现在外部系统A 可能具有以下值
{ 未知, 待定, 预订, 公认, 赶到时, POB, 完成 }
外部系统B 可能包含以下值
{ 等候, 预订, 赶到时, 进行中, 完成 }
等等
现在我需要将外部系统值映射到我的系统值。
例如
外部系统A
未知,待定 - >未决
预订,接受 - >被预订
到达,POB - > INPROGRESS
完成 - >完整
外部系统B
等待 - >未决
预订 - >被预订,
到达,InProgress - > INPROGRESS
完成 - >完整
现在我已经将这个抽象为一个辅助方法MapState,每个适配器使用它来获取状态值。此方法具有字符串参数externalsystem和externalsystemstate,并使用switch语句将外部系统状态映射到我的系统状态。
我认为这非常简单,我相信有一个更优雅的解决方案
有什么建议吗?
答案 0 :(得分:7)
听起来您需要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");
...将返回&#34;预订&#34;。
当然,您想要处理如果外部状态不在预期值列表中会发生什么等。
我想你也可以通过排除&#34;标准&#34;来节省一些重复。来自映射字典的值,并且如果输入不是这些标准值之一,则仅求助于字典。也许可以使用Hashtable
。
我认为我很想使用enum
来表示已解析的值。这样,在测试状态时,下游代码中的字符串操作较少。您可以在需要时使用ToString()
轻松转换回字符串。
答案 1 :(得分:0)
我之前使用过的方法是创建XML映射文件,这些文件在运行时加载,然后用于将一个值映射到另一个值。例如,您可以:
var old_form_action = $('#formname').attr('action');
var new_form_action = old_form_action.replace(/(page=)[^\&]+/, '$1' + '0');
$('#formname').attr('action', new_form_action);
这将处理一个映射到“待定”的情况,这也具有可以由非技术用户在程序外更改的优点。缺点是您需要知道所有可能的传入类型,以便为它们创建映射。
在您的代码中,您可以使用XML解析器加载映射,然后查找传入的字符串并查找正确的属性并输出内部值。
答案 2 :(得分:0)
你需要
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
的相同范围内定义这些方法。