C# 将装饰过的Autofac组件导出到MEF

C# 将装饰过的Autofac组件导出到MEF,c#,.net,mef,autofac,C#,.net,Mef,Autofac,我正在使用Autofac作为项目中的IoC容器。我使用Autofac MEF集成库通过MEF将插件加载到我的容器中。一切正常 我还在一些服务中使用decorator模式,这让我头疼。以下是我注册其中一个的方式: builder.RegisterDecorator<IAuthorizationHandler>((context, handler) => context.Resolve<CachedAuthManager>(new Par

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

我还在一些服务中使用decorator模式,这让我头疼。以下是我注册其中一个的方式:

builder.RegisterDecorator<IAuthorizationHandler>((context, handler) =>
                context.Resolve<CachedAuthManager>(new Parameter[] { new NamedParameter("manager", handler) }), "authhandler", "authcached");
现在我想将其中一个导出到MEF。我无法将上面示例中的扩展方法导出应用于构建器,就像我通常在容器构建器上所做的那样,如下示例:

builder.RegisterType<LogHandler>().As<ILogHandler>).Exported(x => x.As<ILogHandler>());
如何正确、清晰地告诉Autofac我注册的装饰组件将导出到MEF


感谢您的帮助

我想您已经找到了MEF Autofac抽象类比目前出现故障的领域之一

MEF在命名契约上工作得相当频繁,也就是说,基本上已知类型到接口的映射。您可以通过一个命名的契约和一些元数据看到这一点。您还可以从零件目录的工作方式中看到它—导入和导出定义、真正只支持类型部件扫描的目录、指定类型等。。它真的想把一个接口映射到一个类型。。。因此,它可以进一步将这些类型映射到命名契约,并满足堆栈中的依赖链

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

Autofac/MEF桥接器尽其所能伪造东西,并在内部使用命名服务和注册事件使导出与导入对齐。。。但它不支持对动态注册(如decorators)这样做,而decorators在后端实际上相当复杂,用于完成任务

要使其正常工作,需要对Autofac内部进行几行以上的代码更改。。。也就是说,对不起,你现在运气不好


如果这对你来说很重要,你可能会这么做。

谢谢你的详尽回答!我得到一个提示,这不容易解决,因为fluentapi中返回的泛型具有不同的泛型类型参数。我查看了源代码,看看是否有可能使用一种快速的本地扩展方法或其他什么,但没有运气。我最终创建了一个新的导出接口和一个新的具体类,该类依赖于装饰服务。好它起作用了!再次感谢。