IOC能做什么

IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

控制反转:

将控制权移交给第三方容器  new 操作

依赖注入:

在程序的运行过程中 动态的给某个对象 注入他所需要的 实例

 

例子:模拟一个用户购买了一个音乐播放器

用户类

  1. public class User
  2. {
  3. //初始化一个音乐播放器
  4. public MusicPlayer Playe = new MusicPlayer();
  5.  
  6. public void Play()
  7. {
  8. Playe.Play();
  9. }
  10. }
  1. /// <summary>
  2. /// 音乐播放器
  3. /// </summary>
  4. public class MusicPlayer
  5. {
  6. public void Play()
  7. {
  8. Console.WriteLine("音乐播放器");
  9. }
  10. }
  1.  
  1.  

控制台

  1. class Program
  2. {
  3.  
  4. static void Main(string[] args)
  5. {
  6.  
  7. var u =new User();
  8. u.Play();
  9. Console.ReadKey();
  10.  
  11. }
  12. }

输出

需求改变

用户需要将音乐播放器改为视频播放器

1.新建一个视频播放器提供商程序集 以及视频播放器类

  1. /// <summary>
  2. /// 视频播放器
  3. /// </summary>
  4. public class VideoPlayer
  5. {
  6. public void Play()
  7. {
  8. Console.WriteLine("视频播放器");
  9. }
  10. }

2.删除上层的音乐播放器的引用 并引用视频播放器。将用户的new 音乐播放器 改为new视频播放器

  1. public class User
  2. {
  3.  
  4. public VideoPlayer Playe = new VideoPlayer();
  5.  
  6. public void Play()
  7. {
  8. Playe.Play();
  9. }
  10. }

执行输出

问题

  下层改变 影响上层

修改

  遵循设计模式 依赖导致原则

即上层不直接依赖下层。他们都只依赖下层的抽象(抽象类 或接口)

这个时候我们为播放器抽象一个契约

  1. /// <summary>
  2. /// 播放器契约类
  3. /// </summary>
  4. public interface IPlayer
  5. {
  6.  
  7. void Play();
  8. }

并在音乐播放器 和视频播放器 实现播放契约

  1. /// <summary>
  2. /// 视频播放器
  3. /// </summary>
  4. public class VideoPlayer : IPlayer
  5. {
  6. public void Play()
  7. {
  8. Console.WriteLine("视频播放器");
  9. }
  10. }
  1. /// <summary>
  2. /// 音乐播放器
  3. /// </summary>
  4. public class MusicPlayer:IPlayer
  5. {
  6. public void Play()
  7. {
  8. Console.WriteLine("音乐播放器");
  9. }
  10. }

使用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 并标记他对应的接口

  1. /// <summary>
  2. /// 视频播放器
  3. /// </summary>
  4. [Export(typeof(IPlayer))]
  5. public class VideoPlayer : IPlayer
  6. {
  7. public void Play()
  8. {
  9. Console.WriteLine("视频播放器");
  10. }
  11. }
  1. /// <summary>
  2. /// 音乐播放器
  3. /// </summary>
  4. [Export(typeof(IPlayer))]
  5. public class MusicPlayer:IPlayer
  6. {
  7. public void Play()
  8. {
  9. Console.WriteLine("音乐播放器");
  10. }
  11. }

控制台使用

  1. class Program
  2. {
  3. public static CompositionContainer _container;
  4. static void Main(string[] args)
  5. {
  6. AggregateCatalog catalog = new AggregateCatalog();
  7. //将当前程序集 打了特性Export的类 导入容器
  8. catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
  9. //将运行目录下的MusicPlayerManufacturer 打了特性Export的类导入容器
  10. catalog.Catalogs.Add(new AssemblyCatalog(Assembly.Load("MusicPlayerManufacturer")));
  11. _container = new CompositionContainer(catalog);
  12. //在容器中获得User类的对象
  13. var u = _container.GetExportedValue<User>();
  14. u.Play();
  15. Console.ReadKey();
  16.  
  17. }
  18. }

当我们需要使用视频播放器 只需要将视频播放器的接口复制到bin目录   MEF注入 改为 视频播放器接口就行了

还没写完。。。有空再写

.net自带的IOC容器MEF使用的更多相关文章

  1. .NET自带IOC容器MEF之初体验

    .NET自带IOC容器MEF之初体验   本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuil ...

  2. ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  3. NET 自带IOC容器MEF指初体验

    转自:http://www.cnblogs.com/ulex/p/4186881.html IOC容器:工具较多,大体功能都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动 ...

  4. .NET自带IOC容器MEF之初体验(转)

    本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuilder,StructureMap,Spri ...

  5. asp.net Core依赖注入(自带的IOC容器)

    今天我们主要讲讲如何使用自带IOC容器,虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引用别的库. 在新的ASP.NET Core中,大量的采用了依赖注入的方式来编写代码. 比如,在我们的 ...

  6. IOC容器MEF在MVC中的使用

    最近想把自己的网站框架用IOC改造下,经过对比,我初步选择autofac,虽然MEF不需要配置,但性能不行,autofac虽然需要自己写自动化注入,但性能非常好. 先分析下各大IOC框架的性能,分两类 ...

  7. NancyFx中使用自带的IOC容器

    /// <summary> /// Cors扩展 /// </summary> public static class IPipelinesExtensions { /// & ...

  8. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  9. .NetCore下使用Autofac做 IOC 容器

    在.NetCore中使用自带的IOC容器 写注入的时候会写很多,如果要自己封装的话也达不到预期的效果,所以这里采用Autofac来时替代 .NetCore自带的容器 nuget首先引用Autofac. ...

随机推荐

  1. [连载]《C#通讯(串口和网络)框架的设计与实现》- 7.外部接口的设计

    目       录 第七章           外部接口的设计... 2 7.1           插件接口... 2 7.2           图形显示接口... 3 7.3           ...

  2. Linux应用程序基础

    文件位置:     系统命令:/bin和sbin目录,或shell内部指令:     应用程序:/usr/bin和/usr/sbin目录.         /usr/bin:普通执行程序文件:     ...

  3. htm常用标签总结

    1.结构性定义 文件类型 <HTML></HTML> (放在档案的开头与结尾) 文件主题 <TITLE></TITLE> (必须放在「文头」区块内) 文 ...

  4. [JS,Canvas]日历时钟

    [JS,Canvas]日历时钟 Html: <!doctype html> <html> <head> <meta charset="UTF-8&q ...

  5. jQuery技巧大放送

    1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用do ...

  6. AEAI ESB培训大纲

    1. 概述 本文档的目的是为了让使用者能更好的操作.维护.服务于整个ESB系统平台,该信息系统平台不仅需要成熟稳定的产品,更需要技术熟练的运行维护人员,以便能更好地进行科学有效的运行维护工作. AEA ...

  7. 使用IdleTest进行TDD单元测试驱动开发演练(2)

    [前言] 1. 有关上篇请参见<使用IdleTest进行TDD单元测试驱动开发演练(1)>,有关本篇用到Entity Framework Code First请参见<使用NuGet助 ...

  8. Atitit.android播放smb 网络邻居视频文件解决方案

    Atitit.android播放smb 网络邻居视频文件解决方案 Android4.4 1.1. Android4视频播放器不能直接地支持smb协议..子好先转换成个http流 1.2. ES文件浏览 ...

  9. linux memcached安装

    准备安装包: libevent-2.0.21-stable.tar.gz  //Memcached服务端的依赖包 memcached-1.4.29.tar.gz   //Memcached服务端 li ...

  10. 【原】为什么选择iPhone5的分辨率作为H5视觉稿尺寸

    [20160105更新:可以用iPhone6分辨率为视觉稿尺寸啦] 又是一年的520网络情人节,深圳这边却下了大雨,这雨只能是单身汉的泪,而对于我来说这一天具有特别的意义,一来怀念父亲,二来对我这种结 ...