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

我通常使用工厂来解决这类问题。我将首先删除IState/ICountry接口并将它们替换为更具体的IPenaltyCalculator. 让工厂接受所有实例(IEnumerable<IPenaltyCalculator>在工厂的构造函数中)。然后,您通过将上下文信息(当前状态、国家/地区)作为参数传递来向工厂询问正确的实例。IPenaltyCalculator有一个额外的方法:bool AppliesTo(string state, string country). 工厂循环遍历它们并返回第一个trueAppliesTo. 如果没有返回 true,则返回您的DefaultPenaltyCalculator.

于 2012-06-25T15:12:28.800 回答