停止Autofac模块注册已注册的组件

JRo*_*han 6 c# autofac

我有一个Autofac模块,在负载覆盖中具有以下(修剪)逻辑:

protected override void Load(ContainerBuilder builder)
    {
        foreach (var componentType in allTypesInAllAvailableAssemblies) // Set elsewhere
        {
            var handlerInterfaces = componentType.GetInterfaces().Where(i => i.IsClosedTypeOf(typeof(IMessageHandler<>)));
            if (handlerInterfaces.Any())
                builder.RegisterType(componentType).As(handlerInterfaces);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是寻找任何声明自己的消息处理程序并将其注册到它实现的所有IMessageHandler接口的类.

我想要做的是,如果组件已经注册,则不注册该组件.作为奖励,如果我可以更新现有注册以解决消息处理程序接口(如果尚未解决),那将是理想的.

为了参数,可以假设此代码将所有其他类型已注册运行(包括可能的消息处理程序候选)

我过去曾使用AttachToComponentRegistration覆盖进行注册操作,但在这种情况下看起来并不像它有用.

这是可能的还是我应该重新考虑我的设计并强制插件明确声明他们的处理程序?

Nic*_*rdt 8

builder.RegisterType(componentType)
    .As(handlerInterfaces)
    .PreserveExistingDefaults();
Run Code Online (Sandbox Code Playgroud)

将工作.