c# - 事件总线代理 - 如何在 OnActivating 事件期间解析 IEnumerable<T>

标签 c# autofac

假设我有一些接口(interface),例如:IFirstEvent等。现在,我可以有多个实现 IFirstEvent界面。我想在 ContainerBuilder 中注册所有实现为了在实现中使用依赖注入(inject)(和其他 Autofac 特性)。接下来,我想替换 IFirstEvent带有将调用其他实现的代理类(在解析时)(我想注入(inject)单个 IFirstEvent 而不是 IEnumerable<IFirstEvent> 以便使用它)。 我写了以下片段:

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);
                     });

不幸的是,注册会抛出关于循环依赖的错误(很明显 - 在解析 IFirstEvent 的集合时,每个项目都会被代理类替换)。

那么,我怎样才能用代理替换实例并能够找到并解析接口(interface)的所有具体实现? 我不想手动搜索具体实现的程序集,因为我需要手动创建实例(我想避免它以便让 autofac 管理生命周期)。也许没有别的办法?

最佳答案

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

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);

});

ProxyBuilder.ProxyKey 是一个常量。即:

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

关于c# - 事件总线代理 - 如何在 OnActivating 事件期间解析 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29487564/

相关文章:

c# - 从 IIS 获取 ERR_CONNECTION_RESET 而日志中没有信息

c# - ILogger 不需要配置?

c# - Redis 相对于 C# 字典的优势

c# - 带类库的 Autofac

c# - 为实现接口(interface)的所有类型注册通用工厂

.net - Autofac InstancePerMatchingLifetimeScope

c# - Autofac单例处理

c# - 在 Entity Framework 中使用 2 个 DbContext 回滚事务。使用 TransactionScope 还是 TransactionBegin?

c# - Protobuf-net 编译为 DLL 字符串 [] 导致损坏的 dll

c# - ASP.NET MVC 当前对 X 的请求不明确