是否可以从Autofac容器构建器中删除现有注册?

Paw*_*ich 14 c# autofac

这些方面的东西:

builder.RegisterType<MyType>().As<IType>();
builder.RegisterType<MyType2>().As<IType>();
builder.DeRegisterType<MyType>().As<IType>()

var container = builder.Build();
var types = container.Resolve<IEnumerable<IType>>();
Assert.IsTrue(types.Count == 1);
Assert.IsTrue(types[0].GetType == typeof(MyType2));
Run Code Online (Sandbox Code Playgroud)

场景:我经历了一堆程序集,当我注册类型时,我想确保我只有一个给定类型的实现.我需要在创建容器之前执行此操作.我可以自己跟踪,但如果Autofac可以帮助我,那将会很好.

Pet*_*old 12

这不能直接使用ContainerBuilder,除非你从一个新的重新开始.请注意,首先构建一个容器,您应该能够构建一个新容器,过滤掉不需要的类型并重用第一个容器中的注册.像这样:

...
var container = builder.Build();

builder = new ContainerBuilder();
var components = container.ComponentRegistry.Registrations
                    .Where(cr => cr.Activator.LimitType != typeof(LifetimeScope))
                    .Where(cr => cr.Activator.LimitType != typeof(MyType));
foreach (var c in components)
{
    builder.RegisterComponent(c);
}

foreach (var source in container.ComponentRegistry.Sources)
{
    cb.RegisterSource(source);
}

container = builder.Build();
Run Code Online (Sandbox Code Playgroud)

这不是很优雅,但它的工作原理.现在,如果您可以详细说明为什么要这样做,也许有更好的方法.