繁体   English   中英

如何更改实例进程的创建? (例如:DI、工厂……)

[英]How to change the creation of instance process? (ex : DI, Factory…)

在撰写过程中,MEF 创建默认使用构造函数或“ImportingConstructor”导入的类型的实例。

我想覆盖这个创建过程。

例如:

  • 使用 DI 模式(使用 Unity)

  • 使用工厂模式

可以用 MEF 做到这一点吗?

简短的回答:这是可能的,但需要努力。

更长:

我们可以将 MEF 工件的结构简化为:

以上所有类都是抽象的。 如果您分析 MEF 使用的具体类(例如,将CompositionContainerTypeCatalog一起使用),您会发现大部分实现是内部的,注入自定义逻辑的机会并不多。 尽管如此,还是有一些选择。

您可以为特定的具体 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM