【问题标题】:MEF Import Composition IssuesMEF 导入组合问题
【发布时间】:2010-06-07 20:00:00
【问题描述】:

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

我的模块程序集有它们在内部使用的表单和类。这些表单需要访问某些导出的合同,但由于它们不在 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. 对需要满足导入的类使用虚拟导出?

还有其他人吗?

【问题讨论】:

    标签: c# .net mef


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 2017-08-03
      相关资源
      最近更新 更多