我在项目中使用Autofac作为IoC容器。我正在加载"插件"使用Autofac Mef集成库通过MEF进入我的容器。一切顺利。
我也在几个服务上使用装饰模式,这让我很头疼。这是我注册其中一个的方式:
builder.RegisterDecorator<IAuthorizationHandler>((context, handler) =>
context.Resolve<CachedAuthManager>(new Parameter[] { new NamedParameter("manager", handler) }), "authhandler", "authcached");
现在我希望将其中一个导出到MEF。我无法应用扩展方法&#34; Exports&#34;在上面的示例中,对于构建器,正如我通常在容器构建器上所做的那样,如下例所示:
builder.RegisterType<LogHandler>().As<ILogHandler>).Exported(x => x.As<ILogHandler>());
如何正确,干净地告诉Autofac我的已注册的装饰组件是否要导出到MEF?
感谢您提供帮助
答案 0 :(得分:0)
我认为你已经找到了MEF-Autofac抽象类比目前崩溃的领域之一。
MEF在命名合同上非常重要,也就是说(基本上)已知类型到接口的映射。您可以通过export definitions are actually defined - 以命名合同和一些元数据的方式查看此内容。您还可以在零件目录的工作方式中看到它 - 导入和导出定义,真正仅支持类型的目录(装配扫描,指定类型等)。它确实想要将接口映射到一个类型...所以它可以进一步将这些类型映射到命名契约并在堆栈中满足依赖链。
Autofac允许使用lambdas,decorators和注册源提供更多动态功能。支持接口的实际类型可以根据lambda的执行而改变;装饰者就是一个例子。
Autofac / MEF桥接器会尽最大努力伪造东西,并在内部使用命名服务和注册事件获得导入排序......但它不支持像装饰器这样的动态注册(实际上是在后端非常复杂并使用registration sources完成工作。
Autofac内部代码需要更多代码更改才能使其正常工作......也就是说,抱歉,但您目前运气不佳。
如果这对您来说很重要,您可能需要file an issue and/or submit a pull request。