zoukankan      html  css  js  c++  java
  • IoC容器Autofac之实例引入(一)

       先不必尝试理解IOC,先来看段代码。

    一、一个没有使用IoC的例子

    public class MPGMovieLister
       {
           public Movie[] GetMPG()
           {
               var finder = new ListMovieFinder();
               var allMovies = finder.FindAll();
    
               return allMovies.Where(m => m.Name.EndsWith(".MPG")).ToArray();
           }
       }
    
     
    public class ListMovieFinder
       {
           public List<Movie> FindAll()
           {
               return new List<Movie>
                          {
                              new Movie
                                  {
                                      Name = "Die Hard.wmv"
                                  },
                              new Movie
                                  {
                                      Name = "My Name is John.MPG"
                                  }
                          };
           }
       }

    类MPGMovieLister的作用是列出所有的mpg类型的电影,其中调用了类ListMovieFinder类的方法FindAll()来获取所有的电影。

    这段代码看起来还不错,已经符合当前的需求了。

    二、当需求发生变动时,非IoC遭遇到的困境

     假如这个时候,movie的列表获取不是直接创建一个list获取,而要求从某个文本文件读取,或者是数据库获取,又或者从web service中获取,我们怎么办?

    第一步,再实现一个类, 比如FileMovieFinder,来实现从文本文件中读取Movie列表,再把MPGMovieLister中的这行代码,

         var finder = new ListMovieFinder(); 
    替换成

        var finder = new FileMovieFinder(); 
    那么这行代码就又能够符合要求了。

    如果底层获取数据的方式不确定,或者经常更改,MPGMovieLister的代码岂不是要频繁改动? 

    三、使用IoC彻底解决问题:

      上面的问题是什么?MPGMovieLister的功能都是依赖着具体的类,ListMovieFinder,FileMovieFinder。

    当需求发生变化的时候,就会导致MPGMovieLister的代码也要做相应的改动。

    跳出来看,MPGMovieLister的功能只是负责从列表中找出MPG类型的movie, 至于movie从什么地方来的,不是MPGMovieLister的职责,它也不需要关心。

    解耦合的方法就是”依赖于抽象,而不是依赖于具体”.(非常类似于持久层(数据层)和业务逻辑层,业务逻辑层也不关心数据是如何提供的,所以业务逻辑层也应当与持久层解耦合。)

    实际解决之后的代码:
    public class MPGMovieLister
       {
           public Movie[] GetMPG()
          {
               var finder = MovieFinderFactory.GetFinder();
               var allMovies = finder.FindAll();
               return allMovies.Where(m => m.Name.EndsWith(".MPG")).ToArray();
           }
       }
     
    public class MovieFinderFactory
    {
         public static IMovieFinder GetFinder()
         {
             return new FileMovieFinder();
         }
    } 
    
    public interface IMovieFinder
    {
        List<Movie> FindAll()
    }
    

      这里的MovieFinderFactory就已经是一个简陋的IoC容器功能了

    四、总结

    我相信到这里你已经猜到IoC的功能了--解耦,即解决类之间的强依赖关系。 

    真正的IoC容器比上面的MovieFinderFactory自然要好用和适用的多。

  • 相关阅读:
    ASP.NET MVC中防止跨站请求攻击(CSRF)
    C#操作JSON学习
    C# 产生随机密码
    博客园上好的技术系列收藏
    OWIN学习
    bzoj1068: [SCOI2007]压缩
    bzoj1012: [JSOI2008]最大数maxnumber
    bzoj1055: [HAOI2008]玩具取名
    bzoj1011: [HNOI2008]遥远的行星
    bzoj1008: [HNOI2008]越狱
  • 原文地址:https://www.cnblogs.com/tiantianle/p/5135522.html
Copyright © 2011-2022 走看看