如何:基于运行时参数的StructureMap和配置?

时间:2012-06-21 23:51:22

标签: configuration parameters runtime structuremap

简而言之 - 我希望能够基于运行时参数实例化对象。在这种特殊情况下,只有两个参数,但问题是我面临着这些参数的不同排列,并且它变得混乱。

以下是这种情况:我希望得到一个特定对象的实例,例如,给定国家,然后是特定的州/省。因此,考虑到美国,有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值。那可能吗?也许这些设计有问题。

1 个答案:

答案 0 :(得分:1)

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