[英]How to change the creation of instance process? (ex : DI, Factory…)
在撰写过程中,MEF 创建默认使用构造函数或“ImportingConstructor”导入的类型的实例。
我想覆盖这个创建过程。
例如:
使用 DI 模式(使用 Unity)
使用工厂模式
可以用 MEF 做到这一点吗?
简短的回答:这是可能的,但需要努力。
更长:
我们可以将 MEF 工件的结构简化为:
以上所有类都是抽象的。 如果您分析 MEF 使用的具体类(例如,将CompositionContainer与TypeCatalog一起使用),您会发现大部分实现是内部的,注入自定义逻辑的机会并不多。 尽管如此,还是有一些选择。
您可以为特定的具体 MEF 类型实现代理 object。 例如,如果您需要拦截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 使用这些技巧来实现控制器的层次结构、导出可见性scope等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.