c# - 如何配置结构图以提供具体类型的不同配置实例

标签 c# dependency-injection ioc-container structuremap

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

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

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

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

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

因此,在父类中,我希望“facilityConfig”成为传入 enum.facilities 的 Configuration 实例,而“userConfig”对象将是同一配置类的实例,但带有 enum.users通过了。如果我的问题没有意义,请告诉我。

最佳答案

这个问题的一个解决方案可能是有两个独立的配置类,而不是一个基于 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 如何实例化一个 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))));
});

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

关于c# - 如何配置结构图以提供具体类型的不同配置实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13868141/

相关文章:

java - 一个简单的 IOC 容器类有什么问题?

c# - Lucene.Net IndexReader 的 StructureMap 'conditional singleton'

java - 使用 POJO 进行控制反转和依赖注入(inject)

c# - 具有区域的 ASP.NET Core 2 默认路由

c# - 如何使用c#获取根元素的所有键值?

c# - 在 AS3/C# 中使用盐加密字符串

c# - 依赖注入(inject)循环依赖.NET Core 2.0

c# - 使用编译时编织的依赖注入(inject)?

c# - 简单的注入(inject)器为不同的命令使用不同的装饰器

c# - 将 GUI 组件添加到预编译的应用程序