【发布时间】:2021-01-13 14:37:14
【问题描述】:
在撰写过程中,MEF 创建默认使用构造函数或“ImportingConstructor”导入的类型的实例。
我想覆盖这个创建过程。
例如:
-
使用 DI 模式(使用 Unity)
-
使用工厂模式
MEF 可以做到这一点吗?
【问题讨论】:
在撰写过程中,MEF 创建默认使用构造函数或“ImportingConstructor”导入的类型的实例。
我想覆盖这个创建过程。
例如:
使用 DI 模式(使用 Unity)
使用工厂模式
MEF 可以做到这一点吗?
【问题讨论】:
简短回答:有可能,但需要努力。
更长:
我们可以将 MEF 工件的结构简化为:
以上所有类都是抽象的。如果您分析 MEF 使用的具体类(例如,使用 CompositionContainer 和 TypeCatalog),您会发现大部分实现是内部的,没有太多机会注入自定义逻辑。不过,还是有一些选择的。
您可以为特定的、具体的 MEF 类型实现代理对象。例如,如果您需要拦截 CompositionContainer 提供的所有导出值:
示例:
public class CompositionContainerProxy : CompositionContainer
{
protected override IEnumerable<Export> GetExportsCore(ImportDefinition definition, AtomicComposition atomicComposition)
{
IEnumerable<Export> exports = base.GetExportsCore(definition, atomicComposition);
List<Export> proxies = new List<Export>();
foreach (Export export in exports)
{
proxies.Add(new ExportProxy(export, this));
}
return proxies;
}
private object Intercept(object value)
{
return value; // TODO: Provide intercept logic.
}
private class ExportProxy : Export
{
private readonly Export export;
private readonly CompositionContainerProxy proxy;
public override ExportDefinition Definition
{
get { return export.Definition; }
}
internal ExportProxy(Export export, CompositionContainerProxy proxy)
{
this.export = export;
this.proxy = proxy;
}
protected override object GetExportedValueCore()
{
object value = export.Value;
return proxy.Intercept(value);
}
}
}
这样你可以例如确保线程安全等。参见,例如:Controller.cs
QComposite 使用这样的技巧,例如实现控制器的层次结构,出口可见性范围等。 https://qube7.com/guides/controller.html
【讨论】: