C# 事件总线代理-如何解析IEnumerable<;T>;在激活事件期间

C# 事件总线代理-如何解析IEnumerable<;T>;在激活事件期间,c#,autofac,C#,Autofac,考虑到我有一些接口,如:IFirstEvent等。现在,我可以有多个IFirstEvent接口的实现。我想在ContainerBuilder中注册所有实现,以便在实现内部使用依赖项注入(以及其他Autofac功能)。接下来,我想用代理类(在解析时)替换IFirstEvent,该类将调用其他实现(我想注入单个IFirstEvent而不是IEnumerable,以便使用它)。 我写了以下片段: var localEventType = typeof(IFirstEvent); builder.Reg

考虑到我有一些接口,如:
IFirstEvent
等。现在,我可以有多个
IFirstEvent
接口的实现。我想在
ContainerBuilder
中注册所有实现,以便在实现内部使用依赖项注入(以及其他Autofac功能)。接下来,我想用代理类(在解析时)替换
IFirstEvent
,该类将调用其他实现(我想注入单个
IFirstEvent
而不是
IEnumerable
,以便使用它)。 我写了以下片段:

var localEventType = typeof(IFirstEvent);
builder.RegisterAssemblyTypes(this.assemblies)
       .AssignableTo(localEventType)
       .As(localEventType)
       .InstancePerRequest()
       .OnActivating(ctx =>
                     {
                         var allImplementations =
                                  (IEnumerable)
                                  ctx.Context
                                     .Resolve(typeof(IEnumerable<>)
                                       .MakeGenericType(localEventType));

                         var proxy = MultiInterfaceProxy.For(
                                          localEventType, 
                                          allImplementations);
                         ctx.ReplaceInstance(proxy);
                     });
var localEventType=typeof(IFirstEvent);
builder.RegisterAssemblyTypes(this.assemblies)
.AssignableTo(localEventType)
.As(localEventType)
.InstancePerRequest()
.on正在激活(ctx=>
{
var联合实施=
(IEnumerable)
上下文
.Resolve(类型)(IEnumerable)
.MakeGenericType(localEventType));
var proxy=MultiInterfaceProxy.For(
localEventType,
所有实施);
ctx.ReplaceInstance(代理);
});
不幸的是,注册引发了关于循环依赖性的错误(很明显,在解析
IFirstEvent
的集合时,每个项都将被代理类替换)

那么,我如何用代理替换实例,并能够查找和解析接口的所有具体实现呢?
我不想手动搜索程序集的具体实现,因为我需要手动创建实例(为了让autofac管理LifetimeScope,我希望避免使用它)。也许没有其他方法了?

避免循环依赖的一种可能方法是使用键控服务注册实现,然后将委托注册为服务:

var localEventType = typeof(IFirstEvent);
builder.RegisterAssemblyTypes(this.assemblies)
      .AssignableTo(localEventType)
      .Keyed(ProxyBuilder.ProxyKey, localEventType)
      .InstancePerRequest(); 

builder.Register(c =>
{
   Type enumerableEventType = typeof(IEnumerable<>).MakeGenericType(localEventType);
   IEnumerable implementations = (IEnumerable)c.ResolveKeyed(ProxyBuilder.ProxyKey, 
                                                             enumerableEventType);

   var proxy = MultiInterfaceProxy.For(localEventType, 
                                       implementations);

});
public static class ProxyBuilder
{
    public static readonly Object ProxyKey = new Object();
}