【问题标题】:How to change the creation of instance process? (ex : DI, Factory...)如何更改实例进程的创建? (例如:DI,工厂...)
【发布时间】:2021-01-13 14:37:14
【问题描述】:

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

我想覆盖这个创建过程。

例如:

  • 使用 DI 模式(使用 Unity)

  • 使用工厂模式

MEF 可以做到这一点吗?

【问题讨论】:

    标签: c# mef


    【解决方案1】:

    简短回答:有可能,但需要努力。

    更长:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 2018-02-12
      相关资源
      最近更新 更多