1

私のシステムは現在、さまざまな環境で実行されています。

システムに環境列挙型を取得しました。このようなものです

public enum Environment {

    [UsePayPal(false)]
    [ServerInstallDir("InstallPathOnServer")]
    [IntegrationSystemURI("localhost/someFakeURI")]
    [UpdateSomeInfo(true)]
    [QueuePrefix("DEV")]
    [UseCache(false)]
    [AnotherSystemURI("localhost/anotherFakeURI")]
    Development = 0,

    [UsePayPal(false)]
    [ServerInstallDir("InstallPathOnBUILDServer")]
    [IntegrationSystemURI("build-server/someFakeURI")]
    [UpdateSomeInfo(true)]
    [QueuePrefix("QA")]
    [UseCache(false)]
    [AnotherSystemURI("build-server/anotherFakeURI")]
    QA = 1,

    [UsePayPal(true)]
    [ServerInstallDir("InstallPathOnServer")]
    [IntegrationSystemURI("someservice.com/URI")]
    [UpdateSomeInfo(true)]
    [QueuePrefix("PRD")]
    [UseCache(true)]
    [AnotherSystemURI("anotherservice/URI")]
    Production = 2,
}

のようなコードが好きではないので、私はこのように働いています

if(CURRENT_ENVIRONMENT == Environment.QA || CURRENT_ENVIRONMENT == Environment.DEV)
    EnableCache()

また

if(CURRENT_ENVIRONMENT == Environment.QA || CURRENT_ENVIRONMENT == Environment.DEV){
    DoSomeStuff();
}

それは私のロジックが一点ではなく、システム全体に散らばっていると思うからです。

いつか別のテスト環境を追加する場合、開発、QA、または本番環境でのように機能するかどうかを確認するためにコード全体を調べる必要はありません。

わかりましたが、すべての構成で、Enum の属性が非常に複雑になる可能性があります。たとえば、3 年後には、各列挙値に 15 ~ 20 の属性が含まれるようになり、奇妙に見えます。

皆さんはどう思いますか?通常、この状況をどのように処理しますか? 本当に属性が多すぎますか、それとも大丈夫ですか?

4

1 に答える 1

3

コンストラクターと、環境を記述するために必要な数のプロパティを使用してEnvironmentクラスを作成し、インスタンスをパブリックプロパティとして公開します。これらのインスタンスの1つを指すプロパティを持つこともできます。privatestatic readonlyEnvironment.Current

コード例:

sealed class Environment
{
    // The current environment is going to be one of these -- 1:1 mapping to enum values
    // You might also make these properties if there's fine print pointing towards that
    public static readonly Environment TestEnvironment;
    public static readonly Environment ProductionEnvironment;

    // Access the environment through this
    public static Environment Current { get; set; }

    static Environment()
    {
        TestEnvironment = new Environment {
            UsePayPal = false,
            ServerInstallDir = "/test"
        };
        ProductionEnvironment = new Environment { 
            UsePayPal = true, 
            ServerInstallDir = "/prod"
        };
    }

    // Environment propeties here:
    public bool UsePayPal { get; private set; }
    public string ServerInstallDir { get; private set; }

    // We don't want anyone to create "unauthorized" instances of Environment
    private Environment() {}
}

次のように使用します。

Environment.Current = Environment.TestEnvironment;

// later on...
Console.WriteLine(Environment.Current.ServerInstallDir);
于 2012-11-14T12:49:29.723 に答える