.net自带的IOC容器MEF使用
IOC能做什么
IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。
控制反转:
将控制权移交给第三方容器 new 操作
依赖注入:
在程序的运行过程中 动态的给某个对象 注入他所需要的 实例
例子:模拟一个用户购买了一个音乐播放器
用户类
public class User { //初始化一个音乐播放器 public MusicPlayer Playe = new MusicPlayer(); public void Play() { Playe.Play(); } }
/// <summary> /// 音乐播放器 /// </summary> public class MusicPlayer { public void Play() { Console.WriteLine("音乐播放器"); } }
控制台
class Program { static void Main(string[] args) { var u =new User(); u.Play(); Console.ReadKey(); } }
输出
需求改变
用户需要将音乐播放器改为视频播放器
1.新建一个视频播放器提供商程序集 以及视频播放器类
/// <summary> /// 视频播放器 /// </summary> public class VideoPlayer { public void Play() { Console.WriteLine("视频播放器"); } }
2.删除上层的音乐播放器的引用 并引用视频播放器。将用户的new 音乐播放器 改为new视频播放器
public class User { public VideoPlayer Playe = new VideoPlayer(); public void Play() { Playe.Play(); } }
执行输出
问题
下层改变 影响上层
修改
遵循设计模式 依赖导致原则
即上层不直接依赖下层。他们都只依赖下层的抽象(抽象类 或接口)
这个时候我们为播放器抽象一个契约
/// <summary> /// 播放器契约类 /// </summary> public interface IPlayer { void Play(); }
并在音乐播放器 和视频播放器 实现播放契约
/// <summary> /// 视频播放器 /// </summary> public class VideoPlayer : IPlayer { public void Play() { Console.WriteLine("视频播放器"); } }
/// <summary> /// 音乐播放器 /// </summary> public class MusicPlayer:IPlayer { public void Play() { Console.WriteLine("音乐播放器"); } }
使用MEF IOC 实现上层与下层的完全解耦
MEF的特点
1. .net4.0新增 在System.ComponentModel.Composition 程序集 不需要引用第三方类库
2. 0配置:MEF是不需要使用配置文件或代码对接口与实现进行一一配对的,只需要简单的使用几个Attribute特性,就能自动完成源与目标的配对工
3. 自动化:系统初始化时自动遍历程序目录或指定文件夹下的dll,根据程序集中接口与类的特定Attribute特性进行自动配对。
开始使用
1、ui层引用契约接口层 而不引用音乐播放器提供商 和 视频播放器提供商
2.引用MEF所需程序集System.ComponentModel.Composition
将托管于IOC容器的类打上Export 并标记他对应的接口
/// <summary> /// 视频播放器 /// </summary> [Export(typeof(IPlayer))] public class VideoPlayer : IPlayer { public void Play() { Console.WriteLine("视频播放器"); } }
/// <summary> /// 音乐播放器 /// </summary> [Export(typeof(IPlayer))] public class MusicPlayer:IPlayer { public void Play() { Console.WriteLine("音乐播放器"); } }
控制台使用
class Program { public static CompositionContainer _container; static void Main(string[] args) { AggregateCatalog catalog = new AggregateCatalog(); //将当前程序集 打了特性Export的类 导入容器 catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); //将运行目录下的MusicPlayerManufacturer 打了特性Export的类导入容器 catalog.Catalogs.Add(new AssemblyCatalog(Assembly.Load("MusicPlayerManufacturer"))); _container = new CompositionContainer(catalog); //在容器中获得User类的对象 var u = _container.GetExportedValue<User>(); u.Play(); Console.ReadKey(); } }
当我们需要使用视频播放器 只需要将视频播放器的接口复制到bin目录 MEF注入 改为 视频播放器接口就行了
还没写完。。。有空再写
.net自带的IOC容器MEF使用的更多相关文章
- .NET自带IOC容器MEF之初体验
.NET自带IOC容器MEF之初体验 本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuil ...
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- NET 自带IOC容器MEF指初体验
转自:http://www.cnblogs.com/ulex/p/4186881.html IOC容器:工具较多,大体功能都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动 ...
- .NET自带IOC容器MEF之初体验(转)
本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuilder,StructureMap,Spri ...
- asp.net Core依赖注入(自带的IOC容器)
今天我们主要讲讲如何使用自带IOC容器,虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引用别的库. 在新的ASP.NET Core中,大量的采用了依赖注入的方式来编写代码. 比如,在我们的 ...
- IOC容器MEF在MVC中的使用
最近想把自己的网站框架用IOC改造下,经过对比,我初步选择autofac,虽然MEF不需要配置,但性能不行,autofac虽然需要自己写自动化注入,但性能非常好. 先分析下各大IOC框架的性能,分两类 ...
- NancyFx中使用自带的IOC容器
/// <summary> /// Cors扩展 /// </summary> public static class IPipelinesExtensions { /// & ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- .NetCore下使用Autofac做 IOC 容器
在.NetCore中使用自带的IOC容器 写注入的时候会写很多,如果要自己封装的话也达不到预期的效果,所以这里采用Autofac来时替代 .NetCore自带的容器 nuget首先引用Autofac. ...
随机推荐
- Angel工作室EasyUI通用权限管理框架正式发布
框架系统基本功能: 1.管理员管理 2.日志管理 3.菜单导航管理 4.角色管理 5.操作权限管理 6.系统设置管理 7.报表导出 8.系统参数管理 该框架应该说是码农们接单利器的首选解决方案,本框 ...
- 报表或BI的价值在哪?
报表或者bi的价值在哪?这已经是十几年的问题啦! 为什么要解释这个并不新鲜的问题,是因为当一个两个问我的时候,并没有在意,被问的多了,觉得这问题并没有过时. 数据挖掘和建模分析,其价值很容易说出来,因 ...
- heartbeat在yum系发行版本的处理资料
centos 安装包[rpm]和光盘iso文件 http://mirror.centos.org/centos/ 对应如上包的代码 http://vault.centos.org/ git.cento ...
- android 自定义控件——(五)按钮点击变色
----------------------------------按钮点击变色(源代码下有属性解释)------------------------------------------------- ...
- Genymotion报Unable to load virtualbox engine错误
- 初识java之String与StringBuffer(上)
好久没写博客了,一直在纠结后面的路怎么发展?好了不说废话了!!正题开始!! String与StringBuffer类是我们在开发中最常用的,我们现在一起来分析一下这两个类,首先我们先来谈谈String ...
- iOS App 不支持http协议 App Transport Security has blocked a cleartext HTTP (http://)
目前iOS已经不支持http协议了,不过可以通过info.plist设置允许 App Transport Security has blocked a cleartext HTTP (http://) ...
- 原创 C++作用域 (二)
2.3全局作用域 2.3.1概述 全局作用域是最大的名字空间作用域,不同于用户自定义的名字空间作用域,全局作用域不需要显示地定义,它天然存在于C++程序中.全局作用域是一个最外层的容器,是所有作用域的 ...
- javascript-模板方法模式-提示框归一化插件
模板方法模式笔记 父类中定义一组算法操作骨架,而将一些实现步骤延迟到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤 实例:弹出框归一化插件 css样式 ;width ...
- GDB调试命令小结
1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...