using System.Collections.Generic;
using Autofac.Features.AttributeFilters;
public static void Main()
var builder = new ContainerBuilder();
builder.RegisterType<RootService>().As<IRootService>();
builder.RegisterType<Outer_A>().As<IOuterService>().WithAttributeFiltering();
builder.RegisterType<Outer_B>().As<IOuterService>().WithAttributeFiltering();
builder.RegisterType<Inner_X>().Keyed<IInnerService>("A");
builder.RegisterType<Inner_Y>().Keyed<IInnerService>("A").Keyed<IInnerService>("B");
builder.RegisterType<Inner_Z>().Keyed<IInnerService>("B");
var container = builder.Build();
var s = container.Resolve<IRootService>();
public interface IRootService
IEnumerable<IOuterService> Services { get; set; }
public class RootService : IRootService
public IEnumerable<IOuterService> Services { get; set; }
public RootService(IEnumerable<IOuterService> services)
public override string ToString()
return $"Root[{string.Join("-", Services)}]";
public interface IOuterService
string Name { get; set; }
IEnumerable<IInnerService> Services { get; set; }
public interface IInnerService
string Name { get; set; }
public class Outer_A : IOuterService
public string Name { get; set; } = "A";
public IEnumerable<IInnerService> Services { get; set; }
public Outer_A([KeyFilter("A")] IEnumerable<IInnerService> services)
public override string ToString()
return $"Outer_A[{string.Join("-", Services)}]";
public class Outer_B : IOuterService
public string Name { get; set; } = "B";
public IEnumerable<IInnerService> Services { get; set; }
public Outer_B([KeyFilter("B")] IEnumerable<IInnerService> services)
public override string ToString()
return $"Outer_B[{string.Join("-", Services)}]";
public class Inner_X : IInnerService
public string Name { get; set; } = "X";
public override string ToString()
return $"{nameof(Inner_X)}";
public class Inner_Y : IInnerService
public string Name { get; set; } = "Y";
public override string ToString()
return $"{nameof(Inner_Y)}";
public class Inner_Z : IInnerService
public string Name { get; set; } = "Z";
public override string ToString()
return $"{nameof(Inner_Z)}";