gpt4 book ai didi

autofac - 替换 Autofac 中的注册

转载 作者:行者123 更新时间:2023-12-01 16:18:50 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com