简而言之 - 我希望能够基于运行时参数实例化对象。在这种特殊情况下,只有两个参数,但问题是我面临着这些参数的不同排列,并且它变得混乱。
以下是这种情况:我希望得到一个特定对象的实例,例如,给定国家,然后是特定的州/省。因此,考虑到美国,有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值。那可能吗?也许这些设计有问题。
答案 0 :(得分:1)
我经常使用工厂来解决这类问题。我首先删除IState
/ ICountry
接口,然后用更具体的IPenaltyCalculator
替换它们。让工厂接受所有实例(工厂构造函数中的IEnumerable<IPenaltyCalculator>
)。然后通过传递上下文信息(当前状态,国家/地区)作为参数,向工厂询问正确的实例。 IPenaltyCalculator
还有一个方法:bool AppliesTo(string state, string country)
。工厂循环遍历所有并返回从true
返回AppliesTo
的第一个。如果没有返回true,请返回DefaultPenaltyCalculator
。