将修饰的 Autofac 组件导出到 MEF

Exporting decorated Autofac component to MEF

我在项目中使用 Autofac 作为 IoC 容器。我正在使用 Autofac Mef 集成库通过 MEF 将 "plugins" 加载到我的容器中。一切正常。

我还在几个服务上使用装饰器模式,这让我很头疼。这就是我注册其中之一的方式:

builder.RegisterDecorator<IAuthorizationHandler>((context, handler) =>
                context.Resolve<CachedAuthManager>(new Parameter[] { new NamedParameter("manager", handler) }), "authhandler", "authcached");

现在我想将其中一个导出到 MEF。我无法将上面示例中的扩展方法 "Exports" 应用于构建器,就像我通常在容器构建器上所做的那样,例如这个示例:

builder.RegisterType<LogHandler>().As<ILogHandler>).Exported(x => x.As<ILogHandler>());

我如何正确、清晰地告诉 Autofac 我注册的装饰组件要导出到 MEF?

感谢您的帮助

我认为您已经找到了 MEF-Autofac 抽象类比目前失败的领域之一。

MEF 在命名契约上做了大量工作,也就是说(基本上)已知类型到接口的映射。您可以通过 export definitions are actually defined 的方式看到这一点 - 使用命名合同和一些元数据。您还可以在零件目录的工作方式中看到它 - 导入和导出定义、真正仅支持类型(装配扫描、指定类型等)的目录。它真的想将一个接口映射到一个类型......所以它可以进一步将这些类型映射到命名契约并满足堆栈中的依赖链。

Autofac 允许更多动态功能 与 lambda、装饰器和注册源。支持接口的实际类型可以根据 lambda 的执行而改变;装饰器就是一个例子。

Autofac/MEF 桥接器尽最大努力伪造东西,并在内部使用命名服务和注册事件使导出与导入对齐...但它不支持像装饰器这样的动态注册(实际上后端非常复杂,使用 registration sources 来完成它的工作)。

需要对 Autofac 内部结构进行多行代码更改才能使其正常工作...也就是说,抱歉,您现在运气不好.

如果这对您很重要,您可能想要 file an issue and/or submit a pull request