
我不知道如果使用MVVM适用于您,但如果使用MVVM,则可以通过查看使用MEF的MVVM的实现来学习很多。特别是它导入VIEws的方式。
就最佳实践而言…我创建了一个嵌套的扩展层次结构(因此基本模块称为主机,所有这些都是组合应用程序并导入一些基本扩展)。那么这些扩展展开其他扩展点,并在运行它时构建自己的应用程序种类(构图和扩展之间的交叉)。
为了保持一切正常,我将扩展层次结构放在一组静态类中。例如,这里是核心框架提供的所有扩展点:
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已经包含一个退出扩展(预先编程为关闭应用程序)。如果你想添加一个扩展到文件菜单,你可能希望它出现在退出菜单项之前。 IMenuItem继承自IExtension,它具有两个属性:
> InsertrelativeToID
> BeforeOrAfter
所以你的扩展名将返回用于InsertrelativeToID的SoapBox.Core.Extensions.Workbench.MainMenu.fileMenu.Exit,并且将为BeforeOrAfter属性(枚举)返回Before。当工作台导入所有文件菜单扩展名时,它会根据这些ID排序所有内容。以这种方式,后面的扩展插入自己相对于现有的扩展。
总结以上是内存溢出为你收集整理的.net – 什么是MEF最佳做法?全部内容,希望文章能够帮你解决.net – 什么是MEF最佳做法?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)