加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读