我只是在学习C#,请原谅我的n00bness。
我想存储每个处理器的登录凭据,测试设置和测试付款项目。我可以在一分钟内使用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文件,还是可以在一个类中,或者......?
[编辑] 我看到的另一种选择是每次我们有一个测试用例时设置变量,这似乎不是......面向对象的。或者,我想我可以将变量放在[Processor] Portal.cs页面上......我只是希望能够将这个变量放在一个地方而不用大惊小怪,因为偶尔会出现“这适用于每个处理器“测试。
(这也是完全测试数据,现在已经可以看到的同一个人都可以访问,所以我并不担心。)
答案 0 :(得分:3)
.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
个对象映射到具有三个属性的匿名对象 - Website
,Username
和Password
。由于进入的对象属于匿名类(请注意new
与开头大括号之间缺少类名),因此字典的值类型定义为dynamic
。这将允许您在将来添加更多属性而无需更改任何其他属性。
您可以像这样使用ProcessorCreds
:
urlopen(ProcessorCreds[procName].Website);
答案 1 :(得分:2)
您可以将它们放在appsettings部分的App.Config(Web.Config)中,并使用配置管理器获取其值,如下例所示
<appSettings>
<add key="username" value="me" />
<add key="password" value="getmein" />
</appSettings>
在代码中,您将拥有以下内容
string username=ConfigurationManager.AppSettings["username"];
答案 2 :(得分:1)
有很多不同的方法可以做到这一点。您可以将数据存储在静态只读字典中。
public static readonly Dictionary<int, int> MY_DICTIONARY;
并将其置于整个项目中可用的静态类中。
您还可以将数据存储在Properties settings.settings文件中。
通常,在我的C#代码中,我尝试避免全局数据,而是在需要时传递信息。这允许更容易测试的代码。
答案 3 :(得分:1)
使用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
答案 4 :(得分:0)
您的问题比技术问题更具安全性和程序性。
由于您要保存用户名和密码以进行付款处理,因此将这些用户名和密码存储在公开可用的位置存在各种风险。您的企业是否需要PCI合规性?鉴于这是安全信息,您是否希望在某种程度上将它们置于锁定和密钥之下?也许将它们保存在数据库中,或以某种方式加密。
如果没有这样的问题,您的appConfig文件可能是最好的选择:您可以在项目中定义它们,并使用ConfigurationManager类检索它们。它将存储在随应用程序一起部署的XML文件中。用纯文本。
答案 5 :(得分:0)
将它们置于静态动态变量中 - 这是最狡猾的方式,尽管它不是惯用的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;