`

How-to:应用mef 提高程序扩展能力(part3)

UP 
阅读更多

三、引申扩展

 

STEP 1:

To make things more interesting, lets add another implementation of IOutputString that is a bit more creative.

   1: [Export(typeof(IOutputString))]
   2: public class ReverseOutputter : IOutputString
   3: {
   4:  
   5:     public void OutputString(string value)
   6:     {
   7:         foreach (var s in value.Split().Reverse())
   8:         {
   9:             Console.ForegroundColor = (ConsoleColor)(s.Length % 10);
  10:             Console.Write(s + " ");
  11:         }
  12:         Console.WriteLine();
  13:     }
  14: }

Just running this now would give us an error right, because we told MEF we wanted exactly one IOutputString... if we change our code to work with multiple we get more fun! 

 

STEP 2:

In line 7 we changed to request a set of IOutputStrings and in line 19 we changed to loop through all the output devices. 

 

   1: class Program
   2: {
   3:     [Import]
   4:     public IEnumerable<string> Messages { get; set; }
   5:  
   6:     [Import]
   7:     public IEnumerable<IOutputString> OutputSet { get; set; }
   8:  
   9:     public void Run()
  10:     {
  11:         var catalog = new AggregatingComposablePartCatalog();
  12:            catalog.Catalogs.Add (new DirectoryPartCatalog(@"..\..\..\ExternalMessages\bin\Debug"));
  13:            catalog.Catalogs.Add(new DirectoryPartCatalog(@"..\..\..\ExtraMessages"));
  14:            catalog.Catalogs.Add (new AttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly()));
  15:         var container = new CompositionContainer(catalog.CreateResolver());
  16:         container.AddPart(this);
  17:         container.Compose();
  18:  
  19:         foreach (var Out in OutputSet)
  20:         {
  21:             foreach (var s in Messages)
  22:             {
  23:                 Out.OutputString(s);
  24:             }
  25:         }
  26:  
  27:     
  28:         Console.ReadKey();
  29:     }

Now when we run it we get all our messages in all our outputs..

 

输出图示:



 

STEP 3:

Now the only real logic in our main is the nested foreach loops.  We may very well like to change that in the future as well... so let's see if we can abstract that out using exactly the same techniques we have talked about already. 

   1: class Program
   2: {
   3:     [Import]
   4:     public IEnumerable<string> Messages { get; set; }
   5:  
   6:     [Import]
   7:     public IEnumerable<IOutputString> OutputSet { get; set; }
   8:  
   9:     [Import("OutputMessages")]
  10:     public Action<IEnumerable<IOutputString>, IEnumerable<string>> OutputMessages { get; set; }
  11:  
  12:     public void Run()
  13:     {
  14:         var catalog = new AggregatingComposablePartCatalog();
  15:            catalog.Catalogs.Add (new DirectoryPartCatalog(@"..\..\..\ExternalMessages\bin\Debug"));
  16:            catalog.Catalogs.Add(new DirectoryPartCatalog(@"..\..\..\ExtraMessages"));
  17:            catalog.Catalogs.Add (new AttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly()));
  18:         var container = new CompositionContainer(catalog.CreateResolver());
  19:         container.AddPart(this);
  20:         container.Compose();
  21:  
  22:  
  23:         OutputMessages(OutputSet, Messages); 
  24:         
  25:     }

First, in line 9-10 we define an Action that can do the output... and in line 23 we remove our nested foreach loops and replace it with a call to this method.  Now all we have in our Main is effectively wiring up components.  Very loosely coupled!

 

STEP 4:

Now let's add an option for how the messages are outputted.   It would be very easy to define a config file option for selecting these and returning the correct one.  Notice that MEF knows that this method follows the contract of the Action delegate above, so it does all the wireup for us. 

   1: [Export("OutputMessages")]
   2: public void OutputByMessage(IEnumerable<IOutputString> outputSet, IEnumerable<string> messages)
   3: {
   4:     foreach (var s in messages)
   5:     {
   6:         foreach (var Out in outputSet)   
   7:         {
   8:             Out.OutputString(s);
   9:         }
  10:     }
  11:     Console.ReadKey();
  12: }

 

I would love to hear what you think?  Can you think of usage for MEF in your applications?    I'd also love for you to grab the final sample and see how many different ways you can extend it..   Enjoy!

  • 大小: 90.5 KB
分享到:
评论

相关推荐

    MEF框架源代码 MEF框架源代码 MEF框架源代码

    6. **部分类(Part)**:在MEF中,组件通常被称为“部分”,因为它们可以是整个应用程序的一部分,每个部分都可能独立地被替换或扩展。 7. **目录(Catalog)**:目录是包含组件定义的集合,它可以是基于文件系统、...

    MEF-based-WCF-Services:MEF的例子

    总之,MEF-based WCF Services允许我们构建灵活、可扩展的服务,利用C#的特性实现组件之间的依赖注入,使服务能够在运行时动态适应变化。通过深入学习和实践,你可以创建更加健壮和适应性强的WCF解决方案。

    MEF 注入框架入门导引 ppt

    - **MEF(Managed Extensibility Framework)**:是.NET Framework中的一个新库,旨在提高应用程序和组件的重用能力。通过使用MEF,.NET应用能够从静态编译转变为动态组合。 - **软件开发与维护的挑战**: - 原始...

    mef04g-bak-r-iz:mef04g-bak-r-iz 由 GitHub Classroom 创建

    【标题】"mef04g-bak-r-iz: GitHub Classroom 创建的 mef04g-bak-r-iz 项目备份" 这个标题表明我们正在讨论一个由 GitHub Classroom 创建的项目,项目名为 "mef04g-bak-r-iz"。GitHub Classroom 是一个平台,教师...

    vs-mef:Visual Studio使用的托管扩展框架(MEF)实现

    VS MEF(Visual Studio的托管可扩展性框架风格) 特征 您现有的MEF零件的新的,更快的主机 重用您已经在使用的MEF属性 ExportFactory支持创建具有范围有效期(即共享边界)的子容器 文献资料

    mef与wcf整合

    MEF(Managed Extensibility Framework)是.NET Framework中一个用于构建可扩展应用程序的库,它允许开发者在运行时发现并使用外部组件,实现了插件式架构。而WCF(Windows Communication Foundation)是微软提供的...

    MEF-报告:数字时代的个人隐私和对品牌的长期信任(英文)-2020.8-11页2020精品报告.pdf

    他们可能会删除应用程序,或者甚至根本不下载它们。如果他们认为自己的个人信息不安全,他们会取消购买或交易。如果他们感觉组织可能会滥用他们的信任或数据,他们将选择不与该企业合作。 这份报告为行业领导者提供...

    MEF 2 _Preview2

    2. MEF-Silverlight-v40.sln:这表明MEF 2也支持Silverlight平台,这是一个已弃用的轻量级Web应用程序框架。这个解决方案文件可能包含专门针对Silverlight环境的MEF实现。 3. dumbkey.snk:这是一个强名称密钥文件,...

    引导程序:MEF Autofac应用程序引导程序

    3. 发现并导入MEF部件:MEF会扫描指定的程序集或目录,寻找带有`[Export]`属性的类,然后将它们导入到应用程序中。 4. 执行应用程序入口点:引导程序会调用一个主方法,该方法可能包含应用程序的核心逻辑,或者创建...

    WPF prism MEF 架构

    - **插件架构(Plugin Architecture)**:MEF提供了一种机制,允许应用程序在运行时发现和加载外部组件,这些组件可以在不修改主应用程序的情况下添加新功能或扩展已有功能。 - **导出(Export)和导入(Import)**...

    MEF 结合 MVVMLight

    3. **动态加载**:利用MEF,可以实现动态加载新的功能模块,无需重新编译整个应用程序,提高了用户体验。 **在实际应用中,开发者可能需要进行以下步骤:** 1. **定义导出接口**:在MVVMLight的ViewModel或者服务类...

    MEF简单应用

    MEF的主要目标是简化软件的可插拔性和模块化,允许开发者轻松地引入第三方组件或扩展现有功能,而无需深入修改应用程序的核心代码。在本篇中,我们将探讨MEF的基本概念、如何导入和导出部件,以及如何在控制台应用...

    MEF 10.2.pdf

    MEF 10.2文档是关于metro ethernet技术的权威标准,名为“Technical Specification MEF 10.2 Ethernet Services Attributes Phase 2”,该文档于2009年10月27日发布。MEF,即Metro Ethernet Forum(城域以太网论坛)...

    WPF中MEF的应用,简单实例

    总之,MEF在WPF中的应用能帮助开发者构建模块化、可扩展的程序,提高代码的可读性和可维护性。通过理解MEF的核心概念并实践相关的实例,我们可以更好地利用这一强大的框架来提升开发效率和应用质量。

    MEF6-1协议

    标题:MEF6-1协议 描述:城域以太网系列MEF6-1协议,EVC分类详解,基础知识 知识点: 一、MEF6-1协议简介 MEF6.1是城域以太网论坛(Metro Ethernet Forum,简称MEF)于2008年4月发布的技术规范,其主要目标是定义...

    扩展性MEF.rar111

    3. **动态加载**: 应用程序可以根据需求动态加载功能,提高灵活性和响应性。 **MEF的工作流程** 1. **发现**: MEF容器会扫描所有部件(例如,从程序集、文件系统或其他来源)并构建一个部件目录。 2. **匹配**: ...

    MEF组件式开发,模块化开发

    MEF(Managed Extensibility Framework)是微软提供的一种组件化开发框架,主要用于构建可扩展的应用程序。MEF允许开发者将应用程序划分为独立的、可替换的组件,这些组件可以动态地发现并集成到系统中,从而实现了...

    MEF模块解耦,WCF Rest 扩展 基础示例

    MEF(Managed Extensibility Framework)是.NET框架中一个用于构建可扩展应用程序的库,它提供了模块化和解耦的功能。在本示例中,我们将深入探讨如何利用MEF实现应用模块之间的解耦,以及如何将WCF(Windows ...

    C#MEF简单例子

    3. 松耦合:MEF 使得组件之间的耦合度降低,提高了系统的可维护性和可扩展性。 结论 MEF 是一个功能强大且灵活的框架,能够帮助开发者创建可扩展、灵活和松耦合的应用程序。本示例代码展示了 MEF 的基本概念和使用...

    MEF框架整理学习内容

    ### MEF框架知识点详解 ...总之,MEF为.NET平台带来了强大的扩展性和灵活性,极大地提高了应用程序的可维护性和可扩展性。无论是对于小型项目还是大型企业级应用,MEF都是一种值得考虑的技术方案。

Global site tag (gtag.js) - Google Analytics