[英]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.