在构造函数中获取 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();
}
}
如果将
以下内容添加到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>>();