autofac - 替换 Autofac 中的注册

标签 autofac

我有一个进行数据处理的应用程序。有

class Pipeline {
  IEnumerable<IFilter> Filters {get; set;}

我将过滤器实现注册为

builder.RegisterType<DiversityFilter>().As<IFilter>();
builder.RegisterType<OverflowFilter>().As<IFilter>();
...

到目前为止一切顺利。现在,为了进行实验和微调,我希望能够使用程序(脚本)覆盖配置文件中的任何过滤器实现,该程序(脚本)将从标准输入读取数据,处理数据并将数据发送到标准输出。我已经实现了一个带有“fileName”、“args”和“insteadOf”自定义属性的模块,在 xml 中描述了模块并调用了它。

在模块中,我注册了“ExecutableFilter”,但是如何让它运行“而不是”所需的服务?如果我尝试这样做:

builder.RegisterType<ExecutableFilter>().As<DiversityFilter>()

然后我得到一个异常“类型‘ExecutableFilter’不能分配给服务‘DiversityFilter’。”。好吧,这是合乎逻辑的。但我有什么选择呢?

最佳答案

一旦您通过窃听覆盖了 IFilter“After”的注册,您将无法从容器中解析它,因为新的注册将被激活,从而导致循环查找。

相反,创建并注册一个与过滤器的创建 Hook 的模块,并将该实例替换为“窃听”实例:

class WiretapModule : Module
{
  override void AttachToComponentRegistration(
           IComponentRegistration registration,
           IComponentRegistry registry)
  {
    if (registration.Services.OfType<KeyedService>().Any(
          s => s.ServiceKey == After && s.ServiceType == typeof(IFilter))) 
    {
      registration.Activating += (s, e) => {
        e.Instance = new WireTap((IFilter)e.Instance, new ExecuteProvider(fileName, args))
      };
    }
  }
}

(交叉发布到 Autofac 组: https://groups.google.com/forum/#!topic/autofac/yLbTeuCObrU )

关于autofac - 替换 Autofac 中的注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999000/

相关文章:

asp.net-mvc - 使用 NHibernate 和 Autofac 管理多个数据库

c# - 如何在 Autofac InterceptorSelector 的构造函数中使用具有参数的拦截器

c# - 带有 Autofac 的 ASP.NET MVC3 Bootstrap

c# - Autofac - 内存泄漏

c# - AutoFac - 在 app_start 上初始化重量级单例

c# - 将 autofac 与最小起订量一起使用

c# - 如何从静态类中解析命名实例?

c# - 使用 Autofac 的 ASP.NET Core v2.0 的 SignalR 依赖注入(inject)

asp.net-mvc-3 - 使用 Autofac 2.5 进行属性注入(inject)

asp.net-web-api - 多个 owin 监听器拥有自己的一组 Controller ,并使用 Autofac for DI