Chinaunix首页 | 论坛 | 博客
  • 博客访问: 488098
  • 博文数量: 158
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 904
  • 用 户 组: 普通用户
  • 注册时间: 2016-10-10 11:17
文章分类

全部博文(158)

文章存档

2018年(74)

2017年(84)

我的朋友

分类: 服务器与存储

2017-11-23 14:09:28

【摘要】

本文主要介绍了MEF(Managed Extensibility Framework)即托管可扩展框架的所实现的功能及其用法。


【正文】

什么是MEF呢?MSDN上的解释是:Managed Extensibility Framework 即 MEF 是用于创建轻量、可扩展应用程序的库。 它让应用程序开发人员得以发现和使用扩展且无需配置。 它还让扩展开发人员得以轻松地封装代码并避免脆弱的紧密依赖性。 MEF 让扩展不仅可在应用程序内重复使用,还可以跨程序重复使用。

       这段官方的说明可能让人有点懵,我们可以从字面的意思上去理解。可扩展性的框架,也就是说使用了MEF可以通过特定的规则导入导出去匹配到自定义的扩展,进而达到“松耦合高内聚“的设计理念。

       那么我们用下面几个小的demo来认识了解什么是MEF及其它能够帮助我们做什么。

       现在有一个场景:我有一个主处理程序,需要根据不同的情况去执行不同的方法,我们当然可以一开始把不同的情况都考虑进去,把代码尽量写得健壮。但这样,遇到一个新的情况时候,我们还是要反过头来改主处理程序。通过使用MEF,我们可以根据条件动态加载Dll,进而实现代码的松耦合。

       Demo项目如下图:

      

其中:CommonLibrary是各个处理器的共有部分,我们定义一个接口IUserSync 把我们各个处理器都要实现的方法和字段放在里面。


       ERPProccessor是其中一个处理器,里面的实现类继承了IUserSync接口。OAProccessor是另外一个处理器,同样的里面有一个实现类继承了IUserSync接口。

       ProccessorCenter是处理中心,通过条件来决定是调用哪一个处理器里面的实现。

其中OAUserSync类代码如下:

    [Export(typeof(IUserSync))]

    public class OAUserSync : IUserSync

    {

        public string CreateUser()

        {

            return "OACreateSync";

        }

 

        public string UpdateUser()

        {

            return "OAUpdateSync";

        }

 

        public string Properties

        {

            get

            {

                return "OA";

            }

            set

            {

                Properties = value;

            }

        }

    }

Export(IUserSyncIUserSync接口类型。

然后在主处理中心中代码如下:



其中ImportMany导入我们刚刚导出的IUserSync接口,Compose方法实现了读取主程序目录下Dll目录下的所有Dll操作。这样,我们只需要把两个处理器生成Dll文件放在对应的文件夹下,就能够读到两个程序集,并且通过我们内设置的标记字段Properties实现控制。结果如下:




其中MEF提供三种方式发现部件

AssemblyCatalog 在当前程序集发现部件。

DirectoryCatalog 在指定的目录发现部件。

DeploymentCatalog 在指定的XAP文件中发现部件(用于silverlight)

当通过不同方式发现部件的时候,还可以使用AggregateCatalog来把这些部件聚合到一起。

更多资料可以参考:


阅读(2943) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~