2017-03-01 116 views
2

我有兩組Url,一個用於PreProd,一個用於Prod。每個Url都有幾個API節點。而不是硬編碼這些API節點,我保持他們在一個枚舉從字符串方法名稱調用方法

事情是這樣的:

//Prod 
private enum Prod 
{ 
    precheckorder, 
    submitresubmit, 
    creditInquiry, 
    createupdateorder, 
    confirmorder, 
    getorderstatus, 
    cancelorder, 
} 

/// <summary> 
/// Gets the relative URL. 
/// </summary> 
/// <param name="u">The u.</param> 
/// <returns></returns> 
/// <exception cref="Exception"></exception> 
private static string GetRelativeUrl(Prod u) 
{ 
    switch (u) 
    { 
     case Prod.precheckorder: 
      return "https://contesa.tex.com/api/precheckorder"; 
     case Prod.submitresubmit: 
      return "https://contesa.tex.com/api/submitresubmit"; 
     case Prod.creditInquiry: 
      return "https://contesa.tex.com/api/creditinquiry"; 
     case Prod.createupdateorder: 
      return "https://contesa.tex.com/api/createupdateorder"; 
     case Prod.confirmorder: 
      return "https://contesa.tex.com/api/confirmorder"; 
     case Prod.getorderstatus: 
      return "https://contesa.tex.com/api/getorderstatus"; 
     case Prod.cancelorder: 
      return "https://contesa.tex.com/api/cancelorder"; 
     default: 
      // Handle bad URL, possibly throw 
      throw new Exception(); 
    } 
} 

我們使用環境變量來存儲環境的名字和那是什麼決定了要使用的API集。

理想情況下,我想要一個方法,我傳入我的環境和API名稱,它將返回API Url。

喜歡的東西

GettexApiUrlBasedOnEnvironment("Dev", "precheckorder"); 

和響應將是

"https://contoso.tex.com/api/precheckorder" 

任何意見/建議,我們將不勝感激。 TIA

+0

目前尚不清楚你想要做什麼。如果你只是想要返回一個方法,那麼只需要兩個帶重載的方法,其中輸入參數是枚舉類型並執行方法內的邏輯(例如'string MyMethod(EnumType1 en)'和'string MyMethod(EnumType2 EN)「)。另外,我在您展示的Gettex ...方法中看到「Dev」一詞,但在問題的其他地方沒有。你只是試圖根據你是否在release/debug模式下運行來改變結果嗎?如果是這樣,只需使用'#if DEBUG'並在程序加載時放入一些邏輯。什麼是'反射'標籤? – beeker

回答

2

只儲存你的網址,在一個字典,像這樣:

public enum ApiType 
{ 
    precheckorder, 
    submitresubmit, 
    creditInquiry, 
    createupdateorder, 
    confirmorder, 
    getorderstatus, 
    cancelorder, 
} 

public enum EnvironmentType { 
    Dev, 
    Prod 
} 

public static string GettexApiUrl(ApiType apiType) { 
    var envRaw = Environment.GetEnvironmentVariable("YourVariable"); 
    EnvironmentType env; 
    if (!Enum.TryParse(envRaw, out env)) 
     throw new Exception("Invalid environment provided in environment variable YourVariable: " + envRaw); 
    return GettexApiUrlBasedOnEnvironment(env, apiType); 
} 

public static string GettexApiUrlBasedOnEnvironment(EnvironmentType env, ApiType apiType) { 
    if (!_urls.ContainsKey(env)) 
     throw new Exception("Invalid environment " + env); 
    var url = _urls[env]; 
    if (!url.ContainsKey(apiType)) 
     throw new Exception("Invalid api type " + apiType); 
    return url[apiType]; 
} 

private static readonly Dictionary<EnvironmentType, Dictionary<ApiType, string>> _urls = new Dictionary<EnvironmentType, Dictionary<ApiType, string>>(
    ) { 
    {EnvironmentType.Dev, new Dictionary<ApiType, string>() { 
     {ApiType.precheckorder, "https://contoso.tex.com/api/precheckorder"}, 
     // etc 
    } }, { 
     EnvironmentType.Prod, new Dictionary<ApiType, string>() { 
     {ApiType.precheckorder, "https://contesa.tex.com/api/precheckorder"}, 
    }}, 
}; 
+0

美妙而優化的解決方案!!!!! – csharpbd

1

嘗試下面的代碼,沒有額外詞典,enum S,開關\案例等

private static string GettexApiUrlBasedOnEnvironment(string envType, string api) 
{ 
      string env = envType.Equals("Dev") ? "contoso" : "contesa"; 
      return $"http://{env}.tex.com/api/{api}"; 
} 

它很簡單,在新API的情況下不需要維護。

1

您也可以使用反射,而利用這樣的字符串表示獲得枚舉的類型和值:

using System; 
using System.Reflection; 

namespace EnumGames 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      SomeClass sc = new SomeClass(); 
      var ans = sc.GetEnumValue("MyEnum", "OptionB"); 
     } 
    } 

    public class SomeClass 
    { 
     public enum MyEnum 
     { 
      OptionA, 
      OptionB, 
      OptionC 
     } 
     public enum MyOtherEnum 
     { 
      OptionA, 
      OptionB, 
      OptionC 
     } 
     public string GetEnumValue(string enumNameString, string enumOptionString) 
     { 
      var assembly = Assembly.GetExecutingAssembly(); 
      var enumType = assembly.GetType($"{this.ToString()}+{enumNameString}"); 
      var enumOption = Enum.Parse(enumType, enumOptionString); 
      return GetEnumValue(enumOption); 
     } 
     private string GetEnumValue(object enumOption) 
     { 
      if (enumOption is MyEnum) 
      { 
       switch ((MyEnum)enumOption) 
       { 
        case MyEnum.OptionA: 
         return "Hi"; 
        case MyEnum.OptionB: 
         return "Hello"; 
        case MyEnum.OptionC: 
         return "Yo"; 
        default: 
         return "Nope"; 
       } 
      } 
      else if (enumOption is MyOtherEnum) 
      { 
       switch ((MyOtherEnum)enumOption) 
       { 
        case MyOtherEnum.OptionA: 
         return "Bye"; 
        case MyOtherEnum.OptionB: 
         return "Ta-Ta!"; 
        case MyOtherEnum.OptionC: 
         return "Goodbye"; 
        default: 
         return "Nopee"; 
       } 
      } 
      return "Nooope"; 
     } 
    } 
} 

在上面的例子中,GetEnumValue()接收枚舉名稱和選項,將其轉換爲一個真正的枚舉選項,然後使用另一種方法來獲得所需的值。

所以,通過調用

GetEnumValue("MyEnum", "OptionB"); 

我會收到字符串"Hello"

,並通過調用

GetEnumValue("MyOtherEnum", "OptionB"); 

我會收到字符串"Ta-Ta!"

相關問題