用于访问静态数据的设计模式

时间:2017-06-26 09:14:29

标签: c# design-patterns static-data

我有一个场景,我为每个环境都有一组凭据 例如对于dev env username1 / pwd1,对于qa env username2 / pwd2,用于登台username3 / pwd3等等。 现在我想创建一个类,它将根据我提供给它的env返回一组凭据。 所有数据都必须在代码内(根据我的老板,没有xml文件和所有数据),我可以使用哪种设计模式,以便代码优雅,数据可以在以后扩展?

2 个答案:

答案 0 :(得分:0)

就个人而言,我习惯于创建一个频道属性:

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

答案 1 :(得分:0)

如果您使用.Net核心,则可以使用配置技术。 它们非常强大,可以在asp.net和控制台程序中工作 它们是非常可配置和可组合的(例如通过cmd和json传递配置)

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration