3

我如何使用结构图给我配置两种不同可能方式之一的相同具体类型?例如,我有一个类配置为在一个实例中侦听用户队列,但在另一个实例中配置为设施队列。关于对象的其他一切都是一样的。

我创建对象以在构造函数中接受枚举,并且基于枚举值,该对象将侦听设施队列或用户队列。那么如何配置结构映射以将两个不同配置的相同类型的对象传递给我呢?该类实现了我的接口,所以它看起来像这样:

public class Configuration : IConfiguration {
    public Configuration(enum configType) {
        if (configType == enum.users) {
            /* code */
        } else if(configType == enum.facilities) {
            /* code */
        }
    }
}

然后,我试图设置父类两次接受配置对象,一次为设施配置,一次为用户配置。我该怎么做?我想也许我可以根据两个类的实例名称来做到这一点,但我在文档或其他地方找不到任何可以解释如何做到这一点的东西。这是父类的样子:

public class Parent : IParent {
    public Parent(IConfiguration facilityConfig, IConfiguration userConfig) {
    }
}

因此,在父类中,我希望“facilityConfig”成为传入 enum.facilities 的 Configuration 实例,而“userConfig”对象将是同一 Configuration 类的实例,但传入 enum.users。让我知道我的要求是否没有意义。

4

1 回答 1

4

此问题的一种解决方案可能是拥有两个单独的配置类,而不是一个基于enum值进行切换的配置类。

您可以像这样定义IConfiguration实现:

public class UsersConfiguration : IConfiguration
{
    /* code for user */
}

public class FacilitiesConfiguration : IConfiguration
{
    /* code for facilities */
}

然后,在您的容器配置中,您可以使用Ctor指定将构造函数参数解析为的类型:

var c = new StructureMap.Container();

c.Configure(x =>
    {
        x.For<IParent>().Use<Parent>()
            .Ctor<IConfiguration>("facilityConfig").Is<FacilitiesConfiguration>()
            .Ctor<IConfiguration>("userConfig").Is<UsersConfiguration>();
    });

完成此注册后,您可以创建一个IParent实例:

var p = c.GetInstance<IParent>();

并注意容器正确设置了两个依赖项。


更新:

如果有不同的实现IConfiguration是有问题的,那么你可以告诉 StructureMap 如何实例化 a Parent

var c = new Container(x =>
{
    x.For<IParent>().UseSpecial(i => i.ConstructedBy(ConstructParent));
});

ConstructParent()方法可以这样定义:

private static IParent ConstructParent()
{
    return new Parent(
                new Configuration(ConfigType.facilities),
                new Configuration(ConfigType.users));
}

如果您愿意,您可以一次性完成所有操作:

var c = new Container(x =>
{
    x.For<IParent>().UseSpecial(i => i.ConstructedBy(
        _ => new Parent(
            new Configuration(ConfigType.facilities),
            new Configuration(ConfigType.users))));
});

但是,在这种情况下(“除了这个配置值完全一样”),我更愿意提取基类(可能是抽象类)中的通用定义,并有两个只定义不同配置值的派生类。

于 2012-12-13T21:38:33.420 回答