依赖注入及企业库Unity组件学习笔记

对于对象创建技术的发展史,有这么一个故事。比如你想吃饺子,最原始的方式就是自己找面粉饺心自己赶皮包心自己煮,这就是new的方式。你去餐馆去吃饺子,这就是工厂模式。你自己坐在家里说:我要饺子,还是老面皮白菜芯的。然后饺子就出现在你面前了,这就是依赖注入模式。

依赖注入是继工厂模式之后又一思维方式的转变。他解决的是创建对象的方式问题。最原始初始化对象的方式是传统的new方式,然后人们发现当项目规模大到一定程度的时候,当对象的创建者与对象的使用者不是同一人的时候,使用这种编码方式会带来比较紧密的耦合。比如数据层与业务层。数据层的编码者其实不关心你是用哪个对象,以何者方式,向哪种数据库插入数据。他只关心你所能提供的功能。这时候就出现了工厂模式,将对象的创建单独独立出来。常见的工厂模式有简单工厂,抽象工厂,还有许多变种的工厂模式。工厂模式将对象的创建细节封装起来,实现了生产者与使用者的解耦。我们知道一个对象是由很多属性与方法组合起来的,工厂模式强调的是对象的批量生产,生产出来的都是事先规定好的规格。如果你想定制化生产,比如一部份属性由你来提供,工厂模式就不太好办到,或者比较别扭。这时依赖注入横空出世。依赖注入不仅实现对象的自动化生产,还能实现个性化生产,把你所希望的元素加入进去。

常规依赖注入有三种:构造注入,属性注入,接口注入。在实现上,依赖注入提供了一个容器用来存放各种接口/抽象类与实现类的对应关系,或者对象实例。当你需要对象的时候就由这个容器来提供。你可以让容器自己自动去实例化,也可以让容器用你提供的参数去实例化。

.net平台下常见的依赖注入框架有sprint.net与企业库Unity组件。Unity组件是一个轻量级的依赖注入框架,也是我现公司使用的框架。个人感觉还比较不错吧。

这个框架的使用教程我就不写了,网上有很多类似的文章,反正需要掌握的重点有:依赖容器,通过编码注册依赖,通过配置注册依赖(web.config/单独的配置文件),实例化对象,将现有对象注入依赖,对象的生命周期(瞬时,单例),三种注入方式(构造,属性,接口),默认注入(人个命名)与覆盖注入(个人命名)

下面我来解释一下默认注入与覆盖注入,这在网上讲的比较少。初始代码如下:

ExpandedBlockStart.gif 代码
using  System;
using  Microsoft.Practices.Unity;

namespace  Demo.EntLib.Unity
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            
// 1.默认注入
            IUnityContainer container1  =   new  UnityContainer();
            container1.RegisterInstance
< Word > ( new  Word());
            container1.RegisterType
< ISpeak, Teacher > ( " Teacher " );
            container1.RegisterType
< ISpeak, Student > ( " Student " );
            ISpeak s1 
=  container1.Resolve < ISpeak > ( " Teacher " );
            s1.Speak();
            ISpeak s2 
=  container1.Resolve < ISpeak > ( " Student " );
            s2.Speak();
            Console.ReadKey();
            
// 2.手工注入
            IUnityContainer container2  =   new  UnityContainer();
            InjectionConstructor con 
=   new  InjectionConstructor( new  Word());
            container2.RegisterType
< ISpeak, Teacher > ( " Teacher " , con);
            container2.RegisterType
< ISpeak, Student > ( " Student " , con);
            ISpeak s3 
=  container2.Resolve < ISpeak > ( " Teacher " );
            s3.Speak();
            ISpeak s4 
=  container2.Resolve < ISpeak > ( " Student " );
            s4.Speak();
            Console.ReadKey();
            
// 3.手工覆盖注入
            IUnityContainer container3  =   new  UnityContainer();
            container3.RegisterType
< ISpeak, Teacher > ( " Teacher " );
            container3.RegisterType
< ISpeak, Student > ( " Student " );
            ParameterOverride over 
=   new  ParameterOverride( " word " new  Word());
            ISpeak s5 
=  container3.Resolve < ISpeak > ( " Teacher " , over);
            s5.Speak();
            ISpeak s6 
=  container3.Resolve < ISpeak > ( " Student " , over);
            s6.Speak();
            Console.ReadKey();
        }
    }

    
interface  ISpeak
    {
        
void  Speak();
    }

    
public   class  Teacher : ISpeak
    {
        Word word 
=   null ;

        
public  Teacher(Word word)
        {
            
this .word  =  word;
        }
        
public   void  Speak()
        {
            Console.WriteLine(word.GetHashCode());
        }
    }

    
public   class  Student : ISpeak
    {
        Word word 
=   null ;

        
public  Student(Word word)
        {
            
this .word  =  word;
        }
        
public   void  Speak()
        {
            Console.WriteLine(word.GetHashCode());
        }
    }

    
public   class  Word
    {

    }
}


 

     第一种方式是系统默认的注入方式。第二种方式是我在注册类型的时候手工注入对象。第三种方式是构造对象的时候手工注入对象。

     参考的文章:

     Unity: http://www.cnblogs.com/kebixisimba/category/130432.html

     Unity Application Block:http://www.rainsts.net/article.asp?id=283

     你知道Unity IoC Container是如何创建对象的吗?:http://www.cnblogs.com/artech/archive/2010/07/13/1776818.html

     [EntLib]微软企业库5.0 学习之路http://www.cnblogs.com/kyo-yo/archive/2010/11/01/Learning-EntLib-Ninth-Decoupling-Your-System-Using-The-Unity-PART1-Why-Use-Unity.html

转载于:https://www.cnblogs.com/ljzforever/archive/2010/10/27/1862847.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值