简单的IOC

public class MovieLister
   {
       public Movie[] GetMPG(String arg)
      {
            var finder = MovieFinderFactory.GetFinder();
           var allMovies = finder.FindAll();
           return allMovies.Where(m => m.Name.EndsWith(".MPG")).ToArray();
       }
   }
 

public class MovieFinderFactory
{
     public IMovieFinder GetFinder()
     {
         return new FileMovieFinder();
     }
} 

public IMovieFinder
{
    List<Movie> FindAll()
}

MovieLister的功能都是依赖着具体的类,ListMovieFinder,FileMovieFinder。当需求发生变化的时候,就会导致MovieLister的代码也要做相应的改动。

也就是说,MovieLister直接依赖于ListMovieFinder和FileMovieFinder了。

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

而解耦合的方法就是”依赖于抽象,而不是依赖于具体”.

(这个例子非常类似于我们的做开发时候的持久层(数据层)和业务逻辑层,其实业务逻辑层也不关心数据是如何提供的,所以业务逻辑层也应当与持久层解耦合。)

这里MovieLister就依赖于IMovieFinder接口(依赖抽象), 实际运行时候的实例化由MovieFinderFactory来提供。这样,不同的Movie数据源只需要一个实现IMovieFinder 的类就可以了,不会对MovieLister产生任何影响。

 到这里,实际上已经完成了IoC, 控制权最初取决于MovieLister中是如何实例化MovieFinder 的,现在它已经交出控制权,交由外部来提供具体实例对象了。

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

知识共享许可协议
《简单的IOC》常伟华 创作。
采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。
相邻依据:发表时间
  • 多说评论
  • 签名
  • 新浪微博
  • 默认评论
  • Tab Header 5

0 条评论 / 点击此处发表评论

Tab Content 5

开发技术


开发平台和工具

sitemap     178.08ms