MEF导入组件的问题

3

我已经阅读了所有关于在没有导出包含类的情况下组合导入的问题的问题,但我找不到解决我的问题的方法。 有人知道如何实现我要做的事吗?

我的模块程序集具有内部使用的表单和类。 这些表单需要访问一些导出的合同,但是由于它们不在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. 向构造函数传递参数(很麻烦)
  2. 在需要满足导入的类上使用虚拟导出?
还有其他的选择吗?
1个回答

3
在您的特定情况下,我建议将SubForm导出为其具体类型,并在模块中导入它。这样,它的所有导入都将得到满足。虽然如果您希望调用DoSomething超过一次,则会遇到问题。
另一种人们有时候这样做的方法是在主机中手动将CompositionContainer添加到ICompositionService契约下的自身,然后让您的模块导入ICompositionService,每次创建SubForm时,您只需将对象实例传递给ICompositionService.SatisifyImportsOnce以满足其导入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接