.net – 什么是MEF最佳做法?

.net – 什么是MEF最佳做法?,第1张

概述在代码中使用MEF的最佳做法是什么?启动可扩展应用程序时是否有任何陷阱?你有没有遇到过你以前知道的东西? 我正在建立一个完全成熟的可扩展应用程序在MEF(并使用WPF与MVVM模式)。我将基础应用程序框架作为 SoapBox Core开发。我还在Code Project: Building an Extensible Application with MEF, WPF, and MVVM上发布了一 @H_419_6@ 在代码中使用MEF的最佳做法是什么?启动可扩展应用程序时是否有任何陷阱?你有没有遇到过你以前知道的东西?解决方法 我正在建立一个完全成熟的可扩展应用程序在MEF(并使用WPF与MVVM模式)。我将基础应用程序框架作为 SoapBox Core开发。我还在Code Project: Building an Extensible Application with MEF,WPF,and MVVM上发布了一个基于SoapBox Core的演示。

我不知道如果使用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最佳做法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1008266.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存