c# – 用于访问静态数据的设计模式
发布时间:2020-12-15 21:07:08 所属栏目:百科 来源:网络整理
导读:我有一个场景,我有一套每个环境的凭据 例如对于dev env username1 / pwd1,对于qa env username2 / pwd2,用于登台username3 / pwd3等等. 现在我想创建一个类,它将根据我提供给它的env返回一组凭据. 所有数据都必须在代码内(根据我的老板,没有xml文件和所有),
我有一个场景,我有一套每个环境的凭据
例如对于dev env username1 / pwd1,对于qa env username2 / pwd2,用于登台username3 / pwd3等等. 现在我想创建一个类,它将根据我提供给它的env返回一组凭据. 所有数据都必须在代码内(根据我的老板,没有xml文件和所有),我可以使用哪种设计模式,以便代码优雅,数据可以在以后进行扩展? 解决方法
就个人而言,我习惯于创建一个频道属性:
[AttributeUsage(AttributeTargets.Assembly,AllowMultiple = false)] public sealed class AssemblyChannelAttribute : Attribute { public ChannelType Type { get; private set; } public AssemblyChannelAttribute(ChannelType type) { this.Type = type; } } public enum ChannelType { Dev,Beta,PreProd,Prod } 此属性在程序集上设置: #if DEBUG // In release mode,this attribute is set by the MSBuild script [assembly: AssemblyChannel(ChannelType.Dev)] #else 正如评论所说,属性的值是在我的MSBuild脚本的编译时设置的(与我的项目过于关联以向您显示此部分). 设置完所有这些后,您可以创建一个简单的单例,如下所示: public class Credentials { private static readonly Lazy<Credentials> instanceHolder = new Lazy<Credentials>(() => new Credentials()); public IReadOnlyDictionary<string,string> Passwords { get; private set; } public Credentials Instance { get { return instanceHolder.Value; } } private Credentials() { var channel = typeof(Credentials).Assembly .GetCustomAttributes<AssemblyChannelAttribute>() .ElementAt(0) .Type; switch (channel) { case ChannelType.Dev: this.Passwords = new ReadOnlyDictionary<string,string>(new Dictionary<string,string> { ["User1"] = "Pwd1",["User2"] = "Pwd2",// etc }); break; case ChannelType.Beta: // etc break; case ChannelType.PreProd: // etc break; case ChannelType.Prod: // etc break; } } } 然后您可以像这样访问您的凭据: var password = Credentials.Instance.Passwords["User1"]; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |