簡體   English   中英

訪問static數據的設計模式

[英]Design pattern for accessing static data

我有一個場景,其中每個環境都有一組憑據,例如,dev env username1/pwd1、qa env username2/pwd2、staging username3/pwd3 等等。 現在我想創建一個 class,它將根據我提供給它的環境向我返回一組憑據。 所有數據在代碼中都必須為 go(根據我聰明的老板,沒有 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"];

如果使用.Net core,則可以使用配置技術。 它們非常強大,可以在asp .net以及控制台程序中工作。它們非常易於配置和組合(例如通過cmd和json傳遞配置)

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

您所追求的是Multiton設計模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM