zoukankan      html  css  js  c++  java
  • 理解 MEF

    1、它解决什么问题?

      考虑下面的需求,甲程序员对外暴露接口,内部提供实现。乙程序员使用甲提供的接口,根据面向接口编程的原则,乙关联一个接口类型的引用。正常情况下,乙要使用甲的实现,必须实例化一个具体对象。有没有更好的办法呢?我们知道Java框架spring中有个依赖注入的概念。C#中能不能使用类似的方式呢?

    2、怎么解决?

      使用MEF(Managed Extensibility Framework),示例如下:

     1 namespace TestMEF
     2 {
     3     public interface IBookService
     4     {
     5         void GetBookName();
     6     }
     7 
     8     [Export(typeof(IBookService))]
     9     public class ComputerBookService : IBookService
    10     {
    11         public void GetBookName()
    12         {
    13             Console.WriteLine("Computer Book");
    14         }
    15     }
    16 
    17     [Export(typeof(IBookService))]
    18     public class EnglishBookService : IBookService
    19     {
    20         public void GetBookName()
    21         {
    22             Console.WriteLine("English Book");
    23         }
    24     }
    25 
    26     class Program
    27     {
    28         //[Import]
    29         //public IBookService Service { get; set; }
    30 
    31         [ImportMany]
    32         public List<IBookService> ServiceList { get; set; }
    33  
    34         private void Compose()
    35         {
    36             var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
    37             var container = new CompositionContainer(catalog);
    38             container.ComposeParts(this);
    39         }
    40 
    41         static void Main(string[] args)
    42         {
    43             Program p = new Program();
    44             p.Compose();
    45 
    46             //p.Service.GetBookName();
    47 
    48             foreach (IBookService service in p.ServiceList)
    49             {
    50                 service.GetBookName();
    51             }         
    52 
    53             Console.ReadLine();
    54         }
    55     }
    56 }

    说明:有一个实现,使用者那里期望public IBookService Service,有多个实现,使用者期望public List<IBookService> ServiceList 。

    3、通过这个示例,更加深刻理解。软件的本质就是封装,操作系统封装硬件,高级编程语言封装操作系统,应用软件封装高级语言,应用软件暴露UI接口给用户使用。软件本质就是封装,对已有的实现进行封装,暴露出更容易的接口。程序员本身是软件开发者,也是软件使用者,使用其他程序员提供的接口,别人提供的接口也可以认为是一个软件。

  • 相关阅读:
    面向对象反射、元类
    面向对象高级
    面向对象之封装
    抽象、继承、组合
    面向对象基础
    常用模块及其使用(二)
    常用模块及其使用
    模块及模块的使用
    drf框架之视图类、视图家族和路由组件
    drf框架群查接口的筛选组件之搜索过滤组件、排序过滤组件、分页器组件、django_filter插件
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3519715.html
Copyright © 2011-2022 走看看