其他分享
首页 > 其他分享> > CodeGo.net>如何配置结构图,以提供不同配置的具体类型的实例

CodeGo.net>如何配置结构图,以提供不同配置的具体类型的实例

作者:互联网

我如何使用structuremap给我配置2种不同可能方法之一的相同具体类型?例如,我有一个配置为在一个实例中侦听用户队列,但配置为在另一个实例中的设施队列的类.关于对象的其他所有内容都是相同的.

我创建了一个对象以在构造函数中接受一个枚举,然后基于该枚举值,该对象将侦听设施队列或用户队列.那么,如何配置结构图以将同类型的两个不同配置的对象传递给我呢?该类实现了我的接口,因此如下所示:

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传入的实例.让我知道我要问的内容是否没有道理.

解决方法:

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

您可以这样定义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如何实例化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))));
});

但是,在这种情况下(“与该一个配置值完全相同”),我希望提取基类(也许是抽象类)中的公共定义,并具有两个派生类,它们仅定义不同的配置值.

标签:dependency-injection,structuremap,c,ioc-container
来源: https://codeday.me/bug/20191031/1976332.html