代码之家  ›  专栏  ›  技术社区  ›  Tim

MEF进口构成问题

  •  3
  • Tim  · 技术社区  · 15 年前

    我已经阅读了所有我能找到的关于在不导出包含类的情况下编写导入的问题的问题,但是我找不到解决我的问题的方法。有人知道如何实现我的目标吗?

    我的模块程序集具有内部使用的窗体和类。这些表单需要访问一些导出的合同,但不加载导入,因为它们不在MEF“组合树”中。

    主机组件:

    public class Host
    {
        public Host()
        { /* Compose parts here... */ }
    
        [Export(typeof(Licence))]
        public Licence LoadedLicence { get; set; }  
    
        [Export(typeof(IModule))]
        public List<IModule> LoadedModules { get; set; }
    }
    

    模块组装:

    [Export(typeof(IModule))]
    public class Module : IModule
    {        
        public Module() { }
    
        public void DoSomething()
        {
            SubForm sub = new SubForm();
            sub.ShowDialog();
        }
    
        [Import(typeof(Licence))]
        public Licence LoadedLicence { get; set; } // This works here
    }
    
    public class SubForm : Form
    {        
        public SubForm ()
        { }
    
        [Import(typeof(Licence))]
        public Licence LoadedLicence { get; set; } // This doesn't work in here
    }
    

    据我所知,我的选择是:

    1. 将参数传递给构造函数(pain)
    2. 在需要满足导入的类上使用虚拟导出?

    还有其他的吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Wes Haggard    15 年前

    我将简单地将子窗体导出为其具体类型并导入到模块中。在这种情况下,所有的进口都将得到满足。不过,如果您希望多次调用dosomething,则会遇到问题。

    人们有时这样做的另一种方法是在主机中的契约ICompositionService下手动将compositionContainer添加到自身中,然后让模块导入ICompositionService,然后每次创建子窗体时,只需将对象实例传递到ICompositionService.satisifyimportsonce以满足其导入。