分类: 服务器与存储
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来把这些部件聚合到一起。
更多资料可以参考: