首页 > 其他分享 >[MEF]第01篇 MEF使用入门

[MEF]第01篇 MEF使用入门

时间:2023-07-02 11:02:16浏览次数:77  
标签:IBookService 01 void System MEF using public 入门



一、演示概述

此演示初步介绍了MEF的基本使用,包括对MEF中的Export、Import和Catalog做了初步的介绍,并通过一个具体的Demo来展示MEF是如何实现高内聚、低耦合和高扩展性的软件架构。


演示中,针对于IBookService接口,有3个不同版本的实现,分别是ComputerBookServiceImp、HistoryBookServiceImp和MathBookServiceImp,然后通过MEF的导入导出及组装机制,分别在这3个版本的实现间替换,而这种替换并未通过配置文件之类的辅助方式,使用起来,确实有它的方便之处。







二、关键代码

接口定义:


namespace Interface
{
    public interface IBookService
    {
        void GetBookName();
    }
}



针对于接口的3个实现,如下代码所示:


using System;
using System.ComponentModel.Composition;
using Interface;


namespace ComputerBookServiceImp
{
    [Export(typeof(IBookService))]
    public class ComputerBookService : IBookService
    {
        public void GetBookName()
        {
            Console.WriteLine("Computer Book");
        }
    }
}



上面代码除了对接口的实现以外,有两点需要说明的:


1、项目中引用了

System.ComponentModel.Composition程序集,使用MEF必须使用该程序集。


2、使用了

Export特性标记了ComputerBookService类,并且声明其类型为IBookServivce,通过此特性说明该类是MEF的一个导出部件。



其他两个版本的实现和上面雷同,代码如下:



HistoryBookServiceImp


using System;
using System.ComponentModel.Composition;
using Interface;


namespace HistoryBookServiceImp
{
    [Export(typeof(IBookService))]
    public class HistoryBookService : IBookService
    {
        public void GetBookName()
        {
            Console.WriteLine("History Book");
        }
    }
}



MathBookServiceImp


using System;
using System.ComponentModel.Composition;
using Interface;


namespace MathBookServiceImp
{
    [Export(typeof(IBookService))]
    public class MathBookService : IBookService
    {
        public void GetBookName()
        {
            Console.WriteLine("Math Book");
        }
    }
}



然后在修改控制台应用程序Proggram类的代码如下所示:


using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using Interface;


namespace HostApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Program program = new Program();
            program.Compose();
            program.BookService.GetBookName();
        }


        [Import]
        public IBookService BookService { get; set; }


        /// <summary>
        /// 通过容器对象将宿主和部件组装到一起。
        /// </summary>
        public void Compose()
        {
            DirectoryCatalog directoryCatalog = new DirectoryCatalog("imps");
            var container = new CompositionContainer(directoryCatalog);
            container.ComposeParts(this);
        }
    }
}



上面的代码有3点需要说明:


1、通过

Import特性标记BookService为一个导入属性,这样MEF的容器在进行宿主和部件组装的时候,将会查找与之匹配的导出部件,然后进行组装。上述代码所查找的是类型与BooService类型相同的导出部件。


2、通过使用DirectoryCatalog类指明要查找的导出部件位于应用程序根目录下的imps子文件夹中。


3、通过CompositionContainer的扩展方法ComposeParts()组装宿主程序和导出部件。在该方法执行前,BookService属性值为null,运行后,如果找到匹配的导出部件,则创建了该导出部件的一个实例。



三、相关资源


1、MSDN官方资料:

http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx




标签:IBookService,01,void,System,MEF,using,public,入门
From: https://blog.51cto.com/u_3319687/6603776

相关文章

  • go语言快速入门指北
    0前言本文是个人自用的go语言指南学习笔记,主要是方便我个人复习。通过上面那个指南,对于有编程基础的同学,可以在三天内速成go语言(我只花了两天)0.1推荐学习资料基于VSCODE的go环境搭建go语言指南--------适合快速入门topgoer-----我个人比较推荐这个指南go语言圣经--比......
  • [NOIP2001 提高组] 一元三次方程求解
    [NOIP2001提高组]一元三次方程求解题目描述有形如:\(ax^3+bx^2+cx+d=0\)这样的一个一元三次方程。给出该方程中各项的系数(\(a,b,c,d\)均为实数),并约定该方程存在三个不同实根(根的范围在\(-100\)至\(100\)之间),且根与根之差的绝对值\(\ge1\)。要求由小到大依......
  • 选读SQL经典实例笔记01_检索和排序
    1. 在WHERE子句中引用别名列1.1. 当表里的某些列没有被恰当命名的时候,这个技巧尤其有用1.2. sqlselectsalassalary,commascommissionfromempwheresalary<50001.3. 内嵌视图1.3.1.  sqlselect*from(selectsalassalary,commascommission......
  • 数据结构和算法-2023.07.01
    数据结构杂记回忆以前的一些零散的知识点杂谈......
  • Web安全-渗透测试-权限提升01
    权限提升权限提升对我们在深度渗透过程中起着重要作用,接下来我将介绍网站后台,漏洞,第三方,数据库,服务类,第三方接口,服务器系统几方面进行提权介绍参考1后台权限获得方式:爆破,注入猜解,弱口令等获取的帐号密码配合登录一般网站或应用后台只能操作应用的界面内容数据图片......
  • 名人名言_2023.07.01-
    日常学习名人名言,激励自己......
  • 2023-07-01 开摆
    CF671EOrganizingaRace考虑一组\([L,R]\)是否合法。最优的策略肯定是,从\(L\)开始往右走,每次发现油不够了就贪心在自己这里加油。最后把所有剩下的全加在\(R\)上。现在描述一下“油不够”的情况。设\(f_x\)表示从\(n\)走到\(x\)的油量。(可以发现,\(f\)可能有负数......
  • 暑假第二周(6/25~7/01)
    6/25 从今天起,我爸我妈要上班(明明是周日),我弟要上学(万恶且该死的调休政策),所以今天一个人在家(中午也没一个人回来)早上8点,在太阳光的催促下我睁开了双眼,妈妈应该是刚走没多久,弟弟是五点钟起的床,不到六点就到了学校,现在学生真苦,初一就这么紧张。我起来进行洗漱,肚子饿了,在厨房里找......
  • 2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
    2023-07-01:redis过期策略都有哪些?LRU算法知道吗?答案2023-07-01:缓存淘汰算法(过期策略)当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换,这个过程叫做交换(swap)。由于交换的高开销,Redis的性能会急剧下降。对于访问频率较高的Redis实例来说,这样低效的存取效率......
  • 2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
    2023-07-01:redis过期策略都有哪些?LRU算法知道吗?答案2023-07-01:缓存淘汰算法(过期策略)当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换,这个过程叫做交换(swap)。由于交换的高开销,Redis的性能会急剧下降。对于访问频率较高的Redis实例来说,这样低效的存取效率几乎......