繁体   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