2

一言で言えば、ランタイムパラメータに基づいてオブジェクトをインスタンス化できるようにしたいのです。この特定のケースでは、パラメーターは 2 つしかありませんが、問題は、これらのパラメーターのさまざまな順列に直面していて、面倒なことです。

状況は次のとおりです。たとえば、特定の国に固有のオブジェクトのインスタンスを取得し、次に特定の州/県に固有のオブジェクトのインスタンスを取得したいと考えています。したがって、米国を考慮すると、50 の可能な組み合わせがあります。実際にはそれよりも少ないですが、それが最大です。このように考えてみてください。特定の国/州でマリファナを吸った場合のペナルティを知りたいのですが、この情報を渡すと、それが何であるかを示すインスタンス化されたオブジェクトを取得します。

コードへ (参照のみ):

interface IState
{
    string Penalty { get; }
}

interface ICountry
{
    IState State { get; set; }
    string Name { get; }
}

class BasePenalty : IState
{
    virtual public string Penalty { get { return "Slap on a wrist"; } }
}

class USA : ICountry
{
    public USA(IState state)
    {
        State = state;
    }

    public IState State { get; set; }
    public string Name { get { return "USA"; } }
}

class Florida: BasePenalty
{
    public override string Penalty { get { return "Public beheading"; } }
}

// and so on ... I defined other states
// which have penalties other than the "Slap on a wrist"

国と州の組み合わせを指定すると、コンテナがペナルティを返すように設定するにはどうすればよいですか? プロファイルとコンテキスト バインディングの組み合わせを試しましたが、その構成は作成したクラスの数に正比例していました。さまざまな組み合わせを定義するのに苦労しました。コンテナーの構成中に同じことをする必要はありません。国に州を注入したい。また、状態が指定されていない場合は、UsaBasePenalty 値を返したいと思います。それは可能ですか?おそらく、これらは設計上の問題です。

4

1 に答える 1

1

私は通常、この種の問題に Factory を使用します。IState最初に/インターフェイスを削除ICountryし、より具体的な に置き換えますIPenaltyCalculator。ファクトリにすべてのインスタンスを取り込ませます (IEnumerable<IPenaltyCalculator>ファクトリのコンストラクタ内)。次に、コンテキスト情報 (現在の状態、国) をパラメーターとして渡して、ファクトリに正しいインスタンスを要求します。にはIPenaltyCalculator追加のメソッドがあります: bool AppliesTo(string state, string country). trueファクトリはそれらすべてをループし、から返された最初のものを返しますAppliesTo。どれも true を返さない場合は、DefaultPenaltyCalculator.

于 2012-06-25T15:12:28.800 に答える