如何在 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 何时创建了一个新的坚持?
这并不能完全回答您的问题,但它可能是您的另一种解决方案。
如果使用 ISaveAndLoadState
接口导出每个类,则可以在StateManager
中使用ImportMany
[Export(typeof(ISaveAndLoadState))]
public class iAmAPluginViewModelOrModule : ISaveAndLoadState
public class StateManager : IStateManager
{
[ImportMany(typeof(ISaveAndLoadState))]
private List<ISaveAndLoadState> _saveAndLoadStates;
}
然后,_saveAndLoadStates
应该填充所有对象,您可以在 StateManager
Load
和 Save
方法中循环访问它们。