在您的代码中使用MEF的一些最佳实践是什么?在启动可扩展应用程序时需要注意哪些陷阱?你是否遇到过任何你早该知道的问题?
在您的代码中使用MEF的一些最佳实践是什么?在启动可扩展应用程序时需要注意哪些陷阱?你是否遇到过任何你早该知道的问题?
namespace SoapBox.Core.ExtensionPoints
{
public static class Host
{
public const string Styles = "ExtensionPoints.Host.Styles";
public const string Views = "ExtensionPoints.Host.Views";
public const string StartupCommands = "ExtensionPoints.Host.StartupCommands";
public const string ShutdownCommands = "ExtensionPoints.Host.ShutdownCommands";
}
public static class Workbench
{
public const string ToolBars = "ExtensionPoints.Workbench.ToolBars";
public const string StatusBar = "ExtensionPoints.Workbench.StatusBar";
public const string Pads = "ExtensionPoints.Workbench.Pads";
public const string Documents = "ExtensionPoints.Workbench.Documents";
public static class MainMenu
{
public const string Self = "ExtensionPoints.Workbench.MainMenu";
public const string FileMenu = "ExtensionPoints.Workbench.MainMenu.FileMenu";
public const string EditMenu = "ExtensionPoints.Workbench.MainMenu.EditMenu";
public const string ViewMenu = "ExtensionPoints.Workbench.MainMenu.ViewMenu";
public const string ToolsMenu = "ExtensionPoints.Workbench.MainMenu.ToolsMenu";
public const string WindowMenu = "ExtensionPoints.Workbench.MainMenu.WindowMenu";
public const string HelpMenu = "ExtensionPoints.Workbench.MainMenu.HelpMenu";
}
}
public static class Options
{
public static class OptionsDialog
{
public const string OptionsItems = "ExtensionPoints.Options.OptionsDialog.OptionsItems";
}
}
}
因此,如果您希望扩展程序向文件菜单添加某些内容,您需要导出实现IMenuItem接口且合同名称为SoapBox.Core.ExtensionPoints.Workbench.MainMenu.FileMenu的内容。
每个扩展程序都有一个“ID”,它只是一个字符串标识符。这些现有的ID在另一个层次结构中定义:
namespace SoapBox.Core.Extensions
{
public static class Workbench
{
public static class MainMenu
{
public const string File = "File";
public const string Edit = "Edit";
public const string View = "View";
public const string Tools = "Tools";
public const string Window = "Window";
public const string Help = "Help";
public static class FileMenu
{
public const string Exit = "Exit";
}
public static class ViewMenu
{
public const string ToolBars = "ToolBars";
}
public static class ToolsMenu
{
public const string Options = "Options";
}
}
}
}
如您所见,FileMenu已经包含了一个Exit扩展(预设为关闭应用程序)。如果您想要向文件菜单添加扩展,您可能希望它出现在Exit菜单项之前。IMenuItem继承自IExtension,后者有两个属性:
因此,您的扩展将返回SoapBox.Core.Extensions.Workbench.MainMenu.FileMenu.Exit作为InsertRelativeToID,并将返回Before作为BeforeOrAfter属性(一个枚举)。当工作台导入所有文件菜单扩展时,它会基于这些ID对所有内容进行排序。通过这种方式,后来的扩展相对于现有扩展进行插入。
无法工作的应用程序:
这不是很愚蠢吗?模型没有被加载,而且它孤零零地在一个岛上。我认为这就是为什么我的基于MEF的依赖项无法解析的原因(如果有人可以纠正我,我会非常感激!)