MEF导入组合问题

时间:2010-06-07 20:00:01

标签: c# .net mef

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

我的模块程序集包含它们在内部使用的表单和类。这些表单需要访问某些导出的合同,但导入不会加载,因为它们不在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. 在需要导入的类上使用虚拟导出?
  3. 还有其他人吗?

1 个答案:

答案 0 :(得分:3)

我的具体情况我只是将SubForm导出为其具体类型并在Module中导入。在这种情况下,它的所有进口都将得到满足。虽然如果您希望多次调用DoSomething,那么您将遇到问题。

人们有时这样做的另一种方法是在主机中的合同ICompositionService下手动添加CompositionContainer,然后让你的模块导入ICompositionService,然后每次创建SubForm时,只需将对象实例传递给ICompositionService.SatisifyImportsOnce即可获得它的进口满意。