在构造函数中获取 Y 类型的 X 实例

本文关键字:实例 类型 构造函数 获取 | 更新日期: 2023-09-27 18:34:41

如果我在下面的代码中使用 AutoFac 设置我的依赖项,我如何确保objects.ToList()返回一个包含 X 个元素的列表?

public interface IClassA { ... }
public class ClassA : IClassA { ... }
public interface IClassB { ... }
public class ClassB : IClassB
{
    public ClassB(IEnumerable<IClassA> objects)
    {
    }
}

当前集装箱建筑规范(请注意,这与 TopShelf 结合使用(:

public static class DependencyContainer
{
    public static IContainer BuildContainer()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<ClassA>().As<IClassA>();
        builder.RegisterType<ClassB>().As<IClassB>().SingleInstance();
        return builder.Build();
    }
}

在构造函数中获取 Y 类型的 X 实例

如果将

以下内容添加到DependencyContainer类中,则可以指示应将哪些实例注入ClassB构造函数中:

    builder.Register(c => 
                return new [] { c.Resolve<IClassA>(), c.Resolve<IClassA>() })
           .As<IEnumerable<IClassA>>();

所以:

public static class DependencyContainer
{
    public static IContainer BuildContainer()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<ClassA>().As<IClassA>();
        builder.RegisterType<ClassB>().As<IClassB>().SingleInstance();
        builder.Register(c => 
            return new [] { c.Resolve<IClassA>(), c.Resolve<IClassA>() })
               .As<IEnumerable<IClassA>>();
        return builder.Build();
    }
}

如果要在运行时动态创建数字,可以将以下内容添加到DependencyContainer类中:

public static IEnumerable<IClassA> CreateInstances(IComponentContext component)
{
    const int number = 3; // <-- YOU COULD READ THIS FROM A CONFIG FILE
    List<IClassA> instances = new List<IClassA>();
    for(int i = 0; i < number; i++)
    {
        instances.Add(component.Resolve<IClassA>());
    }
    return instances;
}

然后将Register(c => return new [] { ... })替换为:

builder.Register(c => CreateInstances(c)).As<IEnumerable<IClassA>>();