Unity2.0学习笔记-Unity2.0基础-HelloWorld

2.    Unity2.0基础

作为一个依赖注入容器,跟其它的容器相同,Unity的使用主要包括两个步骤:配置容器和从容器中获取对象的实例,在本章就会对这两个步骤逐一进行讲解。

2.1.   Hello World

按照国际惯例,通过一个Hello World的例子使大家对Unity2.0的使用有一个直观的了解,为之后的深入讲解做准备。程序的结构非常简单,有一个ISayHello接口,每个家庭成员都实现了这个接口,其中FamilySayHello类有一个家庭成员对象,用于调用所有的家庭成员的SayHello方法,ChildSayHello类有一个ChildCount属性,用来表示孩子的个数,程序的类图如下:

 

ExpandedBlockStart.gif 接口以及实现类
public   interface  ISayHello
{
    
void  SayHello();
}
public   class  FatherSayHello : ISayHello
{
    
public   void  SayHello()
    {
        Console.WriteLine(
" Father:Hello World! " );
    }
}
public   class  MotherSayHello : ISayHello
{
    
public   void  SayHello()
    {
        Console.WriteLine(
" Mother:Hello World! " );
    }
}
public   class  ChildSayHello : ISayHello
{
    
public   int  ChildCount {  get set ; }

    
public  ChildSayHello()
        : 
this ( 1 ) { }

    
public  ChildSayHello( int  count)
    {
        ChildCount 
=  count;
    }

    
public   void  SayHello()
    {
        
for  ( int  i  =   0 ; i  <  ChildCount; i ++ )
        {
            Console.WriteLine(
string .Format( " Child{0}:Hello World! " , i));
        }
    }
}
public   class  FamilySayHello : ISayHello
{
    
public  ISayHello[] FamilyMembers {  get set ; }

    
public   void  SayHello()
    {
        
if  (FamilyMembers  !=   null )
        {
            
foreach  (var member  in  FamilyMembers)
                member.SayHello();
        }
    }
}

在程序中主要对FamilySayHelloFamily属性和ChildSayHello类的构造函数进行注入。首先,创建一个Unity容器的实例 IUnityContainer container = new UnityContainer(); 然后,使用运行时或设计时方式对容器进行配置。

运行时配置

container.RegisterType<ISayHello, FatherSayHello>("father");

container.RegisterType<ISayHello, MotherSayHello>("mother");

container.RegisterType<ISayHello, ChildSayHello>("child", new InjectionConstructor(2));

container.RegisterType<ISayHello, FamilySayHello>(new InjectionProperty("FamilyMembers", typeof(ISayHello[])));

在这里分别注册了fathermother以及child三个ISayHello接口的类型,其中对ChildSayHello类型进行了构造函数注入,传入了一个Int2,与参数count对应;对FamilySayHello类型进行了属性注入,属性的名字为“FamilyMembers”,类型为ISayHello数组,当从容器中获取FamilySayHello类的实例时,Unity容器会使用ResolveAll<>()方法解析对应的类型,获取所有在Unity容器中注册了的ISayHello类的有名字的实例,并设置到“FamilyMembers”属性上。

Tip:特别要注意的是,ResolveAll方法只返回对应类型的所有设置了name属性的实例,所以这里不会把FamilySayHello实例再次传入,避免了构造FamilySayHello实例时的死循环。

设计时配置

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

 <configSections>

    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>

 </configSections>

 <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">

    <alias alias="ISayHello" type="HelloWorld.ISayHello, HelloWorld" />

    <namespace name="HelloWorld" />

    <assembly name="HelloWorld" />

    <container>

      <register type="ISayHello" mapTo="FamilySayHello">

        <property name="FamilyMembers" dependencyType="HelloWorld.ISayHello[],HelloWorld"/>

      </register>

      <register type="ISayHello" name="father" mapTo="HelloWorld.FatherSayHello,HelloWorld" />

      <register type="ISayHello" name="mother" mapTo="MotherSayHello" />

      <register type="ISayHello" name="child" mapTo="ChildSayHello" >

        <constructor>

          <param name="count" value="2"/>

        </constructor>

      </register>

    </container>

 </unity>

</configuration>

配置文件中的信息基本与设计时的API所对应,所不同的是这里多了aliasnamespaceassembly三个节点。这三个节点是为了容器在运行时查找对应名字的实例时使用的,其中alias表示一个类型的别名,namespaceassembly分别表示了类型所在的名字空间和程序集。这样当我们配置大量类型映射的时候,就不用一个个写出类型的FullName,从而节省大量的配置时间。

Tip:使用名字空间和程序集查找会产生一定程度的性能损失,所以如果应用程序对性能要求很高的话,还是推荐写类型的FullName

  最后,从Unity容器中获取FamilySayHello类型的实例,并调用SayHello方法,结果如下:

Father:Hello World!

Mother:Hello World!

Child0:Hello World!

Child1:Hello World!

请按任意键继续. . .

 

附:Unity程序集下载  

  源码下载(源码中的Unity程序集引用请自行下载上面的程序集修复)

转载于:https://www.cnblogs.com/yingql/archive/2011/04/05/1818551.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值