如何在 MEF 实例化(导出)新对象时执行操作

本文关键字:对象 操作 执行 新对象 导出 MEF 实例化 | 更新日期: 2023-09-27 18:35:14

>我正在使用MEF构建一个模块化应用程序,并一直试图提出如何处理保存/加载状态的聪明想法。在某些情况下(例如,当用户单击"保存"时),我的 shell 将不得不触发某种保存/加载操作,插件可能希望了解这些操作以便能够保存和加载自己的状态。

当然,有很多

可能的方法,包括事件和全局消息总线,但是我目前的首选想法是基于两个接口:

public interface ISaveAndLoadState
{
    void SaveState(XmlWriter writer);
    void LoadState(XmlReader reader);
}
public interface IStateManager
{
    void Register(ISaveAndLoadState item);
    void Save(Stream stream);
    void Load(Stream stream);
}

然后插件 - 它们的模块,视图模型或任何内容 - 可以执行以下操作:

[Export]
public class iAmAPluginViewModelOrModule : ISaveAndLoadState
{
      [ImportingConstructor]
  public iAmAPluginViewModelOrModule(IStateManager m)
  {
        m.Register(this);
  }
  public void SaveState(XmlWriter writer) { ..... }
  public void LoadState(XmlReader reader) { ..... }
}

这应该工作得很好。但是,我认为如果实现ISaveAndLoadState的类不必显式调用IStateManager.Register(),而是当MEF实例化实现ISaveAndLoadState的类时,它会自动将其注册到IStateManager,那就更好了。

所以基本上,每当 MEF 实例化任何新对象时,我都需要一个"事件"触发,然后做类似的事情

public void OnMefHasCreatedInstance(object instance)
{
  var _inst = instance as ISaveAndLoadState;
 if(_inst != null)
   Container.GetExportedValue<IStateManager>().Register(_inst);
}

这可能吗?有没有办法倾听/被告知 MEF 何时创建了一个新的坚持?

如何在 MEF 实例化(导出)新对象时执行操作

这并不能完全回答您的问题,但它可能是您的另一种解决方案。

如果使用 ISaveAndLoadState 接口导出每个类,则可以在StateManager中使用ImportMany

[Export(typeof(ISaveAndLoadState))]
public class iAmAPluginViewModelOrModule : ISaveAndLoadState
public class StateManager : IStateManager
{
    [ImportMany(typeof(ISaveAndLoadState))]
    private List<ISaveAndLoadState> _saveAndLoadStates;
}

然后,_saveAndLoadStates应该填充所有对象,您可以在 StateManager LoadSave 方法中循环访问它们。