什么';这是在C#项目中存储不变变量的好方法

本文关键字:存储 变量 方法 项目 什么 | 更新日期: 2023-09-27 18:23:46

我只是在学习C#,请原谅我的n00bness。

  • 我们使用Visual Studio 2012构建了一个用于自动化测试的C#/Selenium项目
  • 我们有三个信用卡处理器

我想存储每个处理器的登录凭据、测试设置和测试付款项目。我可以在Python中使用dict:在一分钟内完成这项工作

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文件吗,或者它可以在类中,或者。。。?

[EDIT]我看到的另一种选择是,我们在每次有测试用例时都设置变量,这似乎不是。。。面向对象。或者,我想我可以把变量放在[Processor]Portal.cs页面上。。。我只是希望能找到一种方法,把所有这些都放在一个地方,尽量不大惊小怪,因为我们偶尔会进行"这适用于每个处理器"的测试。

(此外,这完全是测试数据,现在已经可以看到的人也可以访问,所以我不担心。)

什么';这是在C#项目中存储不变变量的好方法

.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"];

使用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

有很多不同的方法可以做到这一点。您可以将数据存储在静态只读字典中。

public static readonly Dictionary<int, int> MY_DICTIONARY;

并将其放置在整个项目中可用的静态类中。

您也可以将数据存储在Properties settings.settings文件中。

一般来说,在我的C#代码中,我尽量避免全局数据,而是在需要时传递信息。这使得代码更容易测试。

与技术问题相比,您的问题具有更多的安全性和程序性含义。

由于您要保存用户名和密码以进行支付处理,因此将它们存储在公开的地方会有各种风险。您的企业是否需要PCI合规性?既然这是安全信息,难道你不想在某种程度上把它们锁起来吗?也许将它们保存在数据库中,或者以某种方式加密。

如果没有这样的问题,那么您的appConfig文件可能是最好的选择:您可以在项目中定义它们,并使用ConfigurationManager类检索它们。将存储在随应用程序一起部署的XML文件中。纯文本。

将它们放在一个静态-动态变量中-这是最像蟒蛇的方法,尽管它不是惯用的c#

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; 访问它