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使用的更多相关文章

  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. Mybatis框架的模糊查询(多种写法)、删除、添加(四)

    学习Mybatis这么多天,那么我给大家分享一下我的学习成果.从最基础的开始配置. 一.创建一个web项目,看一下项目架构 二.说道项目就会想到需要什么jar 三.就是准备大配置链接Orcl数据库 & ...

  2. ipad&mobile通用webapp框架前哨战

    响应式设计的意义 随着移动设备的发展,移动设备以迅猛的势头分刮着PC的占有率,ipad或者android pad的市场占有率稳步提升,所以我们的程序需要在ipad上很好的运行,对于公司来说有以下负担: ...

  3. 什么是IIFE

    立即执行函数表达式(Immediately-invoked function expression) IIFE 我们知道,在javascript(ES5)中,是没有块级作用域的概念的.看一个例子 fo ...

  4. Atittit.研发公司的组织架构与部门架构总结

    Atittit.研发公司的组织架构与部门架构总结 1. archi组织架构与 部门规划2 1.1. 最高五大组织机构2 1.2. 宗教事务部2 1.3. 制度与重大会议委员会2 1.4. 纠纷处理部: ...

  5. Images.xcassets不能获取图片路径

    原文地址:http://www.jianshu.com/p/5358f587af38 Images.xcassets在app打包后,以Assets.car文件的形式出现在bundle中.其作用在于: ...

  6. 菜单(Menu)的三中创建方式——Android开发之路2

    菜单的三种创建方式 一.OptionsMenu---选项菜单 Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单.这种菜单叫做选项菜单(Options Menu ...

  7. 解决apache启动错误"httpd:Could not reliably determine..."

    启动apache遇到错误:httpd: Could not reliably determine the server's fully qualified domain name [root@serv ...

  8. Mysql常用函数,难点,注意

    一.数学函数 ABS(x)   返回x的绝对值 BIN(x)   返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x)   返回大于x的最小整数值 EXP(x)   返回值e( ...

  9. wamp下Apache配置vhost

    1.由于后面虚拟机中需要用到Rewrite所以先编辑Apache的conf目录下的httpd.conf文件.(我的文件位置是:D:\Program Files\wamp\bin\apache\apac ...

  10. AC日记——滑动窗口 洛谷 P1886

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...