簡體   English   中英

在C#項目中存儲不變變量的好方法是什么?

[英]What's a good way to store unchanging variables in a C# project?

我只是在學習C#,請原諒我的n00bness。

  • 我們使用Visual Studio 2012將C#/ Selenium項目組合在一起進行自動化測試。
  • 我們有三個信用卡處理器。

我想存儲每個處理器的登錄憑據,測試設置和測試付款項目。 我可以在一分鍾內使用dict在Python中完成此操作:

processorCreds = {
    'ProcOne': {
        'website': '[url]',
        'username': '[username]',
        'password': '[password]'
    },
    'ProcTwo': {
        'website': '[url]',
        'username': '[username]',
        'password': '[password]'
    },
}

然后我會在需要時調用它:

def openProcessor(procName):
    urllib2.urlopen(processorCreds[procName]['website'])

openProcessor('ProcTwo')

基本上我想在C#中使用它。 我很少需要更改這些憑據,它們將在多個測試用例中使用,因此我希望能夠在任何需要的地方提取信息。

對我來說,最好的方法是什么? 我應該使用XML文件,還是可以在一個類中,或者......?

[編輯]我看到的替代方法是,每當我們有一個測試用例時就設置變量,這似乎不是面向對象的。 或者,我想我可以將變量放在[Processor] Portal.cs頁面上......我只是希望能夠將這個變量放在一個地方而不用大驚小怪,因為偶爾會出現“這適用於每個處理器測試。

(這也完全是測試數據,現在已經可以看到它的同一個人可以訪問,因此我並不擔心。)

.NET提供了許多存儲常量或接近常量數據的方法:您可以選擇多種方式讀取XML文件,配置文件,使用您自己的格式的資源文件等等。 如果您想在代碼中定義類似於您的結構,可以使用IDictionary

internal static readonly IDictionary<string,dynamic> ProcessorCreds =
    new Dictionary<string,dynamic> {
        {"ProcOne", new {
            Website = "[url]",
            Username = "[username]",
            Password = "[password]"
        },
        {"ProcTwo", new {
            Website = "[url]",
            Username = "[username]",
            Password = "[password]"
        }
    };

這將創建一個Dictionary實例,它將string對象映射到具有三個屬性的匿名對象 - WebsiteUsernamePassword 由於進入的對象屬於匿名類(注意new和大括號之間缺少類名),因此字典的值類型被定義為dynamic 這樣一來,您將來便可以添加更多屬性,而無需進行其他任何更改。

你可以像這樣使用ProcessorCreds

urlopen(ProcessorCreds[procName].Website);

您可以將它們放在appsettings部分的App.Config(Web.Config)中,並使用配置管理器獲取其值,如下面的示例所示

<appSettings>
    <add key="username" value="me" />
    <add key="password" value="getmein" />
</appSettings>

在代碼中,您將擁有以下內容

string username=ConfigurationManager.AppSettings["username"];

有很多不同的方法可以做到這一點。 您可以將數據存儲在靜態只讀字典中。

public static readonly Dictionary<int, int> MY_DICTIONARY;

並將其放在整個項目中可用的靜態類中。

您也可以將數據存儲在Properties settings.settings文件中。

通常,在我的C#代碼中,我嘗試避免全局數據,而是在需要時傳遞信息。 這允許更容易測試的代碼。

使用C#或Python並沒有大大改變這個問題的答案。 如果在Python中使用像字典這樣的可變內存數據結構,那么你可以在C#中做同樣的事情。

類似的答案使用動態,但它更慣用,C#有許多優點,有利於使用靜態類型,如下所示:

public class Processor {
    public Uri Website { get; private set; }
    public string Username { get; private set; }
    public string Password { get; private set; }
    public Processor(Uri website, string username, string password) {
        Website = website;
        Username = username;
        Password = password;
    }
}

var processorCreds = new Dictionary<string, Processor> {
    { "ProcOne", new Processor(new Uri("[url]"), "[username]", "[password]") },
    { "ProcTwo", new Processor {new Uri("[url]"), "[username]", "[password]") }
};

哪種情況可以用作

processorCreds["ProcOne"].Website

您的問題比技術問題具有更多的安全性和程序含義。

由於您要保存用戶名和密碼以進行付款處理,因此存在將它們存儲在公開位置的各種風險。 您的企業是否需要PCI合規性? 鑒於這是安全性信息,您是否不想在某種程度上將它們保持在鎖鑰狀態? 也許將它們保存在數據庫中,或以某種方式進行加密。

如果沒有這樣的問題,您的appConfig文件可能是最好的選擇:您可以在項目中定義它們,並使用ConfigurationManager類檢索它們。 將會存儲在與您的應用程序一起部署的XML文件中。 以純文本格式。

將它們放在靜態動態變量中-盡管不是慣用的C#,但這是最Python化的方法

static dynamic processorCreds =new {
    ProcOne= new {
        website= "[url]",
        username= "[username]",
        password= "[password]"
    },
    ProcTwo= new {
        website= "[url]",
        username= "[username]",
        password= "[password]"
    },
}

然后,您可以使用var s = (string) processorCreds.ProcTwo.website;訪問它var s = (string) processorCreds.ProcTwo.website;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM