C# ------ MEF
MEF全称Managed Extensibility Framework, 是一个用于创建可扩展的轻型应用程序的库。开发人员可以利用MEF发现并使用扩展,但并不需要配置,而且还可以在应用程序之间重用扩展。应用程序的扩展是一个大型应用程序架构师必须考虑的一个问题。以前的解决办法通常是用配置文件,接口及反射技术来进行实现。而MEF则 提供一种通过隐式发现组件的方法。MEF 组件以声明方式同时指定其依赖项(称为“导入”)及其提供的功能(称为“导出”)。MEF 是 .NET Framework 4 的组成部分,早期的 .NET Framework 版本引入了 Managed Add-in Framework (MAF),旨在使应用程序能够隔离和管理扩展。 MAF 的重点放在比 MEF 稍高的级别,它集中于扩展隔离以及程序集的加载和卸载,而 MEF 则集中于可发现性、扩展性和可移植性。 这两个框架可以顺利地进行互操作,并且单个应用程序可以同时利用这两个框架。
本文简单的测试一下MEF,
首先新建一个控制台工程.并添加MEF框架的引用,既 System.ComponentModel.Composition.dll,然后键入如下代码:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.Composition;
- using System.ComponentModel.Composition.Hosting;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- namespace MEFDemo
- {
- class Program
- {
- //导入对象使用
- [Import("chinese_hello")]
- public Person oPerson { set; get; }
- [Import("TestProperty")]
- public string ConsoleTest { get; set; }
- [Import("ActionTest")]
- public Action<string> TestActionImport { set; get; }
- [Import("FuncTest")]
- public Func<string> TestFuncImport { set; get; }
- [Import("FuncTestvalue")]
- public Func<string,string> TestFuncImport2 { set; get; }
- //多参数
- // public Func<string, string,string> TestFuncImport2 { set; get; }
- static void Main(string[] args)
- {
- var oProgram = new Program();
- oProgram.MyComposePart();
- #if false
- //测试一
- var strRes = oProgram.oPerson.SayHello("李磊");
- Console.WriteLine(strRes);
- #endif
- #if true
- ////测试二
- oProgram.TestActionImport("Jim");//无返回值
- var a = oProgram.TestFuncImport();//有返回值
- var b = oProgram.TestFuncImport2("可以传参");//可以传参有返回值
- //Console.WriteLine(a);
- Console.WriteLine(b);
- #endif
- Console.Read();
- }
- //宿主MEF并组合部件
- void MyComposePart()
- {
- //Assembly.GetExecutingAssembly():当前方法所在程序集
- //Assembly.GetCallingAssembly():调用当前方法的方法 所在的程序集
- var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
- var container = new CompositionContainer(catalog);
- //将部件(part)和宿主程序添加到组合容器
- container.ComposeParts(this);
- }
- }
- public class TestPropertyImport
- {
- [Export("TestProperty")]
- public string TestMmport { get { return "测试属性可以导入导出"; } }
- [Export("ActionTest", typeof(Action<string>))]
- public void TestAction(string name)
- {
- Console.WriteLine("Hello:" + name);
- }
- [Export("FuncTest", typeof(Func<string>))]
- public string TestFunc()
- {
- return "Hello:" + "";
- }
- [Export("FuncTestvalue", typeof(Func<string,string>))]
- public string TestFuncValue(string name)
- {
- return "Hello:" + name;
- }
- }
- //声明对象可以导出
- [Export("chinese_hello", typeof(Person))]
- public class Chinese : Person
- {
- public string SayHello(string name)
- {
- return "你好:" + name;
- }
- }
- [Export("american_hello", typeof(Person))]
- public class American : Person
- {
- public string SayHello(string name)
- {
- return "Hello:" + name;
- }
- }
- public interface Person
- {
- string SayHello(string name);
- }
- }
C# ------ MEF的更多相关文章
- MEF学习
一. 什么是MEF MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置. 扩 ...
- 如何用 MEF 扩展应用程序
最近在写一篇关于如何扩展 Visual Studio 编辑器的文章时,用到了 MEF,因此打算写一篇文章提一下这个技术点.本篇文章并不打算详细介绍 MEF,只是一个最简单的入门,相信您在阅读本篇文章后 ...
- 【WPF】运用MEF实现窗口的动态扩展
若干年前,老周写了几篇有关MEF的烂文,简单地说,MEF是一种动态扩展技术,比如可以指定以某个程序集或某个目录为搜索范围,应用程序在运行时会自动搜索符合条件的类型,并自动完成导入,这样做的好处是,主程 ...
- [MEF插件式开发] 一个简单的例子
偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...
- .net自带的IOC容器MEF使用
IOC能做什么 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序. 控制反转: 将控制权移交给第三方容器 new 操作 依赖注入: 在程序 ...
- NET 自带IOC容器MEF指初体验
转自:http://www.cnblogs.com/ulex/p/4186881.html IOC容器:工具较多,大体功能都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动 ...
- 实战MEF(4):搜索范围
在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然MEF框架怎么知道哪里有扩展组件呢? 就像我们用导航系统去查找某 ...
- 实战MEF(3):只导出类的成员
通过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值.上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放心,如果大家觉得看文章 ...
- 实战MEF(2):导出&导入
上一文中,我们大致明白了,利用MEF框架实现自动扫描并组装扩展组件的思路.本文我们继续前进,从最初的定义公共接口开始,一步步学会如何使用MEF. 在上一文中我们知道,对于每一个实现了公共规范的扩展组件 ...
- 实战MEF(1):一种不错的扩展方式
在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...
随机推荐
- SpringMVC:自定义视图及其执行过程
一:自定义视图 1.自定义一个实现View接口的类,添加@Component注解,将其放入SpringIOC容器 package com.zzj.view; import java.io.PrintW ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:复选框(Checkbox)和单选框(Radio)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- SqlParameter 类
SqlParameter 类 表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射.无法继承此类. 命名空间: System.Data.SqlClient 程序集: System ...
- Maven项目-控制台乱码
乱码显示: 解决方法:
- Android将数据存储到应用的数据目录下
下面是具体代码,其中MainActivity.java的部分代码有修改,在文章后面给出 logindemo_layout.java <?xml version="1.0" e ...
- SQL SERVER查询数据库所有的表名/字段
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='subject' --表名 1.利用sysobjects系统表 在这个表中,在数据 ...
- php: 文件上传
1.主页: <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...
- Ubuntu 16.04非编译安装Zabbix 3.2----服务端和客户端win的配置
控服务器 - 什么是Zabbix Zabbix是企业级开源分布式监控服务器解决方案. 该软件监控网络的不同参数和服务器的完整性,还允许为任何事件配置基于电子邮件的警报. Zabbix根据存储在数据库( ...
- phpMydmin的GetShell思路
phpMyadmin简介 phpMyadmin是一个以PHP为基础的MySQL数据库管理工具,使网站管理员可通过Web接口管理数据库 . 信息收集 此部分主要需要收集的是网站物理路径,否则后续无法通过 ...
- python爬虫破解带有RSA.js的RSA加密数据的反爬机制
前言 同上一篇的aes加密一样,也是偶然发现这个rsa加密的,目标网站我就不说了,保密. 当我发现这个网站是ajax加载时: 我已经习以为常,正在进行爬取时,发现返回为空,我开始用findler抓包, ...