我已经阅读了所有我能找到的关于在不导出包含类的情况下组合导入的问题,但我找不到解决我的问题的方法。有人知道实现我想要做的事情的方法吗?
我的模块程序集有它们在内部使用的表单和类。这些表格需要访问一些导出的契约(Contract),但不会加载导入,因为它们不在 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
}
据我所知,我的选择是:
- 将参数传递给构造函数(痛苦)
- 对需要导入满足的类使用虚拟导出?
还有其他的吗?
最佳答案
根据您的具体情况,我将简单地将 SubForm 导出为其具体类型并导入到模块中。在那种情况下,它的所有进口都将得到满足。尽管如果您希望不止一次调用 DoSomething 那么您将遇到问题。
人们有时这样做的另一种方法是在主机中的契约(Contract) ICompositionService 下手动将 CompositionContainer 添加到自身,然后让模块导入 ICompositionService 然后每次创建 SubForm 时只需将对象实例传递到 ICompositionService.SatisifyImportsOnce 即可获得其进口满意。
关于c# - MEF 导入组合问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2992696/