<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Timothy&#039;s Space &#187; unity</title>
	<atom:link href="http://www.xiaozhou.net/tag/unity/feed" rel="self" type="application/rss+xml" />
	<link>http://www.xiaozhou.net</link>
	<description>君看一叶舟，出没风波里</description>
	<lastBuildDate>Thu, 02 Sep 2010 15:10:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Unity 学习笔记(3) &#8212; 生命周期管理</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm#comments</comments>
		<pubDate>Tue, 28 Apr 2009 15:33:31 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[life-cycle]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[unity]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=220</guid>
		<description><![CDATA[Unity根据我们在注册类型的时候所指定的生命周期来管理注册类型的创建和解析。当我们在向容器中注册类型的时候，如果我们没有显式的指明该类型的生命周期管理器(下称:Lifetime Manager)，默认的情况下，容器会为我们注册的类型创建一个生命周期短暂的管理器。这样一来，当我们每次调用容器的Resolve方法或者ResolveAll方法，或者采用依赖机制注入实例到其他的类中的时候，容器都会为我们创建新的实例，并且容器不会保存对实例的引用。 容器的RegisterType函数包含多个支持泛型的重载，同时还包含了一一对应的非泛型重载。其中的重载函数，我们可以看到类似下面的声明： 1: RegisterType&#60;TFrom, TTo&#62;(LifetimeManager lifetime) 参数中的LifetimeManager类型，就是用来控制注册类型生命周期的。Unity中提供了几个继承自LifetimeManager的类作为注册类型的生命周期管理器。在目前的Unity 1.2版本中，共提供了3个LifetimeManager供我们直接在代码中调用。此外，我们也可以实现自己的LifetimeManager，不过必须实现LifetimeManager所必须的一些方法。 1.ContainerControlledLifetimeManager: 容器负责管理注册类型的生命周期，并且注册类型的生命周期和容器一致。当离开容器的作用域范围时，容器会被销毁，同时其中的注册类型也会被销毁。或者，当容器被显式销毁时，其中的注册类型也同样被销毁。但是在容器有效的作用域范围中，当我们使用Resolve方法，或者使用ResolveAll方法获取我们的注册类型的时候，容器会在第一次调用时，创建实例，但是在后面的调用中，我们始终只会得到相同的实例。我们可以利用这种Manager来实现Singleton模式。 2.ExternallyControlledLifetimeManager: 和上一种方式类似，不过容器在不会保留对注册类型的强引用，而只是保留弱引用。也就是说，如果这个注册类型没有在其他地方被强引用的时候，那么这个注册类型可能会被GC给干掉。 3.PerThreadLifetimeManager: 容器保证在每个线程中返回同一个对象实例，那么在不同的线程中，得到的实例是不同的。 下面我们可以试验一下不同的LifetimeManager的效果 a. 默认的情况，不显示的指明LifetimeManager 代码： 1: namespace UnityDemo 2: { 3: class Program 4: { 5: static void Main(string[] args) 6: { 7: IUnityContainer container = new UnityContainer(); 8: container.RegisterType&#60;INotify, EmailNotify&#62;(); 9: 10: INotify notify1 = container.Resolve&#60;INotify&#62;(); 11: 12: INotify notify2 [...]]]></description>
			<content:encoded><![CDATA[<p>Unity根据我们在注册类型的时候所指定的生命周期来管理注册类型的创建和解析。当我们在向容器中注册类型的时候，如果我们没有显式的指明该类型的生命周期管理器(下称:Lifetime Manager)，默认的情况下，容器会为我们注册的类型创建一个生命周期短暂的管理器。这样一来，当我们每次调用容器的Resolve方法或者ResolveAll方法，或者采用依赖机制注入实例到其他的类中的时候，容器都会为我们创建新的实例，并且容器不会保存对实例的引用。</p>
<p>容器的RegisterType函数包含多个支持泛型的重载，同时还包含了一一对应的非泛型重载。其中的重载函数，我们可以看到类似下面的声明：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>RegisterType&lt;TFrom, TTo&gt;(LifetimeManager lifetime)</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>参数中的LifetimeManager类型，就是用来控制注册类型生命周期的。Unity中提供了几个继承自LifetimeManager的类作为注册类型的生命周期管理器。在目前的Unity 1.2版本中，共提供了3个LifetimeManager供我们直接在代码中调用。此外，我们也可以实现自己的LifetimeManager，不过必须实现LifetimeManager所必须的一些方法。</p>
<p>1.ContainerControlledLifetimeManager:</p>
<p>容器负责管理注册类型的生命周期，并且注册类型的生命周期和容器一致。当离开容器的作用域范围时，容器会被销毁，同时其中的注册类型也会被销毁。或者，当容器被显式销毁时，其中的注册类型也同样被销毁。但是在容器有效的作用域范围中，当我们使用Resolve方法，或者使用ResolveAll方法获取我们的注册类型的时候，容器会在第一次调用时，创建实例，但是在后面的调用中，我们始终只会得到相同的实例。我们可以利用这种Manager来实现Singleton模式。</p>
<p>2.ExternallyControlledLifetimeManager:</p>
<p>和上一种方式类似，不过容器在不会保留对注册类型的强引用，而只是保留弱引用。也就是说，如果这个注册类型没有在其他地方被强引用的时候，那么这个注册类型可能会被GC给干掉。</p>
<p>3.PerThreadLifetimeManager:</p>
<p>容器保证在每个线程中返回同一个对象实例，那么在不同的线程中，得到的实例是不同的。</p>
<p>下面我们可以试验一下不同的LifetimeManager的效果</p>
<p>a. 默认的情况，不显示的指明LifetimeManager</p>
<p>代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">namespace</span> UnityDemo</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   6:  </span>        {</pre>
<pre class="alt"><span class="lnum">   7:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   8:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;();</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>            INotify notify1 = container.Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  11:  </span></pre>
<pre><span class="lnum">  12:  </span>            INotify notify2 = container.Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  13:  </span></pre>
<pre><span class="lnum">  14:  </span>            Console.WriteLine(<span class="str">"notify1:"</span> + notify1.GetHashCode());</pre>
<pre class="alt"><span class="lnum">  15:  </span>            Console.WriteLine(<span class="str">"notify2:"</span> + notify2.GetHashCode());</pre>
<pre><span class="lnum">  16:  </span></pre>
<pre class="alt"><span class="lnum">  17:  </span>            Console.ReadLine();</pre>
<pre><span class="lnum">  18:  </span>        }</pre>
<pre class="alt"><span class="lnum">  19:  </span>    }</pre>
<pre><span class="lnum">  20:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行结果：</p>
<p><a href="/pics/Unity3_9C33/4.jpg"><img class="alignnone" style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="4" src="/pics/Unity3_9C33/4_thumb.jpg" border="0" alt="4" width="457" height="134" /><br />
</a></p>
<p>从结果我们可以看到，默认情况下不指定LifetimeManager的时候，每次我们获得的Instance其实不是同一个Instance.</p>
<p>b.使用ContainerControlledLifetimeManager</p>
<p>代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">namespace</span> UnityDemo</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   6:  </span>        {</pre>
<pre class="alt"><span class="lnum">   7:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   8:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;(<span class="kwrd">new</span> ContainerControlledLifetimeManager());</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>            INotify notify1 = container.Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  11:  </span></pre>
<pre><span class="lnum">  12:  </span>            INotify notify2 = container.Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  13:  </span></pre>
<pre><span class="lnum">  14:  </span>            Console.WriteLine(<span class="str">"notify1:"</span> + notify1.GetHashCode());</pre>
<pre class="alt"><span class="lnum">  15:  </span>            Console.WriteLine(<span class="str">"notify2:"</span> + notify2.GetHashCode());</pre>
<pre><span class="lnum">  16:  </span></pre>
<pre class="alt"><span class="lnum">  17:  </span>            Console.ReadLine();</pre>
<pre><span class="lnum">  18:  </span>        }</pre>
<pre class="alt"><span class="lnum">  19:  </span>    }</pre>
<pre><span class="lnum">  20:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行结果:</p>
<p><a href="/pics/Unity3_9C33/5.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="5" src="/pics/Unity3_9C33/5_thumb.jpg" border="0" alt="5" width="488" height="134" /></a><br />
使用ContainerControlledLifetimeManager，在Container生命中期内，我们得到的Instance是同一个。</p>
<p>c.使用PerThreadLifetimeManager</p>
<p>代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">namespace</span> UnityDemo</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   6:  </span>        {</pre>
<pre class="alt"><span class="lnum">   7:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   8:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;(<span class="kwrd">new</span> PerThreadLifetimeManager());</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>            Thread thread1 = <span class="kwrd">new</span> Thread(<span class="kwrd">new</span> ParameterizedThreadStart(ThreadProc1));</pre>
<pre class="alt"><span class="lnum">  11:  </span>            Thread thread2 = <span class="kwrd">new</span> Thread(<span class="kwrd">new</span> ParameterizedThreadStart(ThreadProc2));</pre>
<pre><span class="lnum">  12:  </span></pre>
<pre class="alt"><span class="lnum">  13:  </span>            thread1.Start(container);</pre>
<pre><span class="lnum">  14:  </span>            thread2.Start(container);</pre>
<pre class="alt"><span class="lnum">  15:  </span></pre>
<pre><span class="lnum">  16:  </span>            Console.ReadLine();</pre>
<pre class="alt"><span class="lnum">  17:  </span>        }</pre>
<pre><span class="lnum">  18:  </span></pre>
<pre class="alt"><span class="lnum">  19:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> ThreadProc1(<span class="kwrd">object</span> obj)</pre>
<pre><span class="lnum">  20:  </span>        {</pre>
<pre class="alt"><span class="lnum">  21:  </span>            INotify notify1 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve&lt;INotify&gt;();</pre>
<pre><span class="lnum">  22:  </span>            INotify notify2 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  23:  </span></pre>
<pre><span class="lnum">  24:  </span>            Console.WriteLine(<span class="str">"ThreadProc1 --- notify1:"</span> + notify1.GetHashCode());</pre>
<pre class="alt"><span class="lnum">  25:  </span>            Console.WriteLine(<span class="str">"ThreadProc1 --- notify2:"</span> + notify2.GetHashCode());</pre>
<pre><span class="lnum">  26:  </span></pre>
<pre class="alt"><span class="lnum">  27:  </span>        }</pre>
<pre><span class="lnum">  28:  </span></pre>
<pre class="alt"><span class="lnum">  29:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> ThreadProc2(<span class="kwrd">object</span> obj)</pre>
<pre><span class="lnum">  30:  </span>        {</pre>
<pre class="alt"><span class="lnum">  31:  </span>            INotify notify1 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve&lt;INotify&gt;();</pre>
<pre><span class="lnum">  32:  </span>            INotify notify2 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  33:  </span></pre>
<pre><span class="lnum">  34:  </span>            Console.WriteLine(<span class="str">"ThreadProc2 --- notify1:"</span> + notify1.GetHashCode());</pre>
<pre class="alt"><span class="lnum">  35:  </span>            Console.WriteLine(<span class="str">"ThreadProc2 --- notify2:"</span> + notify2.GetHashCode());</pre>
<pre><span class="lnum">  36:  </span>        }</pre>
<pre class="alt"><span class="lnum">  37:  </span>    }</pre>
<pre><span class="lnum">  38:  </span>}</pre>
</div>
<pre>运行结果：</pre>
<pre><a href="/pics/Unity3_9C33/6.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="6" src="/pics/Unity3_9C33/6_thumb.jpg" border="0" alt="6" width="493" height="132" /></a></pre>
<pre> 在结果中可以看到，同一个线程中连续两次获取到的是同一个Instance，而不同的线程中获取到的Instance不一样。</pre>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2009年04月25日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm" title="Unity 学习笔记(2) &#8212; 配置文件的使用">Unity 学习笔记(2) &#8212; 配置文件的使用</a> (4)</li><li>2009年04月23日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm" title="Unity 学习笔记(1) &#8212; Unity简介及简单使用">Unity 学习笔记(1) &#8212; Unity简介及简单使用</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unity 学习笔记(2) &#8212; 配置文件的使用</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm#comments</comments>
		<pubDate>Sat, 25 Apr 2009 12:24:01 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[unity]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=218</guid>
		<description><![CDATA[在Unity的配置中，使用配置文件也是一种非常灵活的方式，毕竟能够通过修改配置文件的文本就能达到改动的目的，而不需要对源码进行改动、重新编译。使用配置文件对Unity进行配置，需要增加两个程序集的引用：System.Configuration和Microsoft.Practices.Unity.Configration，并且在代码中用相应的两个命名空间： 1: using System.Configuration; 2: using Microsoft.Practices.Unity.Configuration; 此外，需要修改应用程序的配置文件： 在configSections节点中，加入Unity的section配置信息 &#60;configSections&#62; ... &#60;section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/&#62; &#60;/configSections&#62; &#60;configSections&#62; ... &#60;section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/&#62; &#60;/configSections&#62; 其中name是section的名称，type就是处理该section的程序类型，Unity提供了UnityConfigurationSection，负责处理配置文件信息，它包含在程序集Microsoft.Practices.Unity.Configuration中 接下来，需要在configuration节点中增加Unity配置节点，格式如下： 1: &#60;unity&#62; 2: &#60;typeAliases&#62; 3: &#60;typeAlias alias="" type="" /&#62; 4: &#60;typeAliases /&#62; 5: &#60;containers &#62; 6: &#60;container&#62; 7: &#60;types&#62; 8: &#60;type type="" mapTo="" /&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>在Unity的配置中，使用配置文件也是一种非常灵活的方式，毕竟能够通过修改配置文件的文本就能达到改动的目的，而不需要对源码进行改动、重新编译。使用配置文件对Unity进行配置，需要增加两个程序集的引用：System.Configuration和Microsoft.Practices.Unity.Configration，并且在代码中用相应的两个命名空间：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">using</span> System.Configuration;</pre>
<pre><span class="lnum">   2:  </span><span class="kwrd">using</span> Microsoft.Practices.Unity.Configuration;</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>此外，需要修改应用程序的配置文件：</p>
<p>在configSections节点中，加入Unity的section配置信息</p>
<div class="csharpcode">
<pre><span style="font-family: Simsun; white-space: normal; font-size: small;">
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;configSections&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">...</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;section name="unity"</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;/configSections&gt;</div>
<pre>&lt;<span style="font-family: Simsun;"><span style="white-space: normal;">configSections&gt;</span></span></pre>
<pre><span style="font-family: Simsun;"><span style="white-space: normal;">...</span></span></pre>
<pre><span style="font-family: Simsun;"><span style="white-space: normal;">&lt;section name="unity"</span></span></pre>
<pre><span style="font-family: Simsun;"><span style="white-space: normal;">type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/&gt;</span></span></pre>
<pre><span style="font-family: Simsun;"><span style="white-space: normal;">&lt;/configSections&gt;</span></span></pre>
<p></span></pre>
<pre><span style="font-family: Simsun; white-space: normal; font-size: small;">其中name是section的名称，type就是处理该section的程序类型，Unity提供了UnityConfigurationSection，负责处理配置文件信息，它包含在程序集Microsoft.Practices.Unity.Configuration中</span></pre>
</div>
<p>接下来，需要在configuration节点中增加Unity配置节点，格式如下：</p>
<div class="csharpcode">
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>&lt;unity&gt;</pre>
<pre><span class="lnum">   2:  </span>    &lt;typeAliases&gt;</pre>
<pre class="alt"><span class="lnum">   3:  </span>      &lt;typeAlias alias=<span class="str">""</span> type=<span class="str">""</span> /&gt;</pre>
<pre><span class="lnum">   4:  </span>    &lt;typeAliases /&gt;</pre>
<pre class="alt"><span class="lnum">   5:  </span>    &lt;containers  &gt;</pre>
<pre><span class="lnum">   6:  </span>      &lt;container&gt;</pre>
<pre class="alt"><span class="lnum">   7:  </span>         &lt;types&gt;</pre>
<pre><span class="lnum">   8:  </span>           &lt;type type=<span class="str">""</span> mapTo=<span class="str">""</span> /&gt;</pre>
<pre class="alt"><span class="lnum">   9:  </span>         &lt;/types&gt;</pre>
<pre><span class="lnum">  10:  </span>         &lt;instances&gt;</pre>
<pre class="alt"><span class="lnum">  11:  </span>           &lt;add name=<span class="str">""</span> type=<span class="str">""</span> <span class="kwrd">value</span>=<span class="str">""</span> /&gt;</pre>
<pre><span class="lnum">  12:  </span>         &lt;/instances&gt;</pre>
<pre class="alt"><span class="lnum">  13:  </span>      &lt;/container&gt;</pre>
<pre><span class="lnum">  14:  </span>    &lt;/containers&gt;</pre>
<pre><span class="lnum">  16:  </span>&lt;/unity&gt;</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>unity的子元素，包含节点大致如上，其宗typeAliases是type别名，能够简化下面types中type的配置。containers节点中可以包含多个container的配置。container主要包含的子元素有types元素，instance元素，types元素可以包含多个type元素，用以添加注册类型，instance主要用来添加实例到容器中。type元素，主要包含四个属性：</p>
<p>name：表示注册类型的名称，此属性在配置中可选。</p>
<p>type:注册的源类型</p>
<p>mapto:注册的目标类型</p>
<p>lifetime:设置注册类型的生命周期</p>
<p>此外，还有instances元素，包括name,type,value,typeConverter四个属性。value表示注册实例的初始值，typeConverter是用以转换提供的值到实例的匹配类型的类型转换器。</p>
<p>具体的元素含义，可以参考Unity的帮助文档。</p>
<p>下面我们还是采用Monitor的例子，来实现用配置文件注册类型，配置文件示例：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>&lt;?xml version=<span class="str">"1.0"</span> encoding=<span class="str">"utf-8"</span> ?&gt;</pre>
<pre><span class="lnum">   2:  </span>&lt;configuration&gt;</pre>
<pre class="alt"><span class="lnum">   3:  </span>  &lt;configSections&gt;</pre>
<pre><span class="lnum">   4:  </span>    &lt;section name=<span class="str">"unity"</span> type=<span class="str">"Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"</span> /&gt;</pre>
<pre class="alt"><span class="lnum">   5:  </span>  &lt;/configSections&gt;</pre>
<pre><span class="lnum">   6:  </span></pre>
<pre class="alt"><span class="lnum">   7:  </span>  &lt;unity&gt;</pre>
<pre><span class="lnum">   8:  </span>    &lt;containers&gt;</pre>
<pre class="alt"><span class="lnum">   9:  </span>      &lt;container&gt;</pre>
<pre><span class="lnum">  10:  </span>        &lt;types&gt;</pre>
<pre class="alt"><span class="lnum">  11:  </span>          &lt;type type=<span class="str">"UnityDemo.IMonitor,UnityDemo"</span> mapTo=<span class="str">"UnityDemo.Monitor,UnityDemo"</span> /&gt;</pre>
<pre><span class="lnum">  12:  </span>          &lt;type type=<span class="str">"UnityDemo.INotify,UnityDemo"</span> mapTo=<span class="str">"UnityDemo.EmailNotify,UnityDemo"</span> /&gt;</pre>
<pre class="alt"><span class="lnum">  13:  </span>        &lt;/types&gt;</pre>
<pre><span class="lnum">  14:  </span>      &lt;/container&gt;</pre>
<pre class="alt"><span class="lnum">  15:  </span>    &lt;/containers&gt;</pre>
<pre><span class="lnum">  16:  </span>  &lt;/unity&gt;</pre>
<pre class="alt"><span class="lnum">  17:  </span></pre>
<pre><span class="lnum">  18:  </span>&lt;/configuration&gt;</pre>
</div>
<p><!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>程序代码修改如下：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">using</span> System;</pre>
<pre><span class="lnum">   2:  </span></pre>
<pre class="alt"><span class="lnum">   3:  </span><span class="kwrd">using</span> Microsoft.Practices.Unity;</pre>
<pre><span class="lnum">   4:  </span><span class="kwrd">using</span> Microsoft.Practices.Unity.Configuration;</pre>
<pre class="alt"><span class="lnum">   5:  </span><span class="kwrd">using</span> System.Configuration;</pre>
<pre><span class="lnum">   6:  </span></pre>
<pre class="alt"><span class="lnum">   7:  </span><span class="kwrd">namespace</span> UnityDemo</pre>
<pre><span class="lnum">   8:  </span>{</pre>
<pre class="alt"><span class="lnum">   9:  </span>    <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">  10:  </span>    {</pre>
<pre class="alt"><span class="lnum">  11:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">  12:  </span>        {</pre>
<pre class="alt"><span class="lnum">  13:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">  14:  </span>            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(<span class="str">"unity"</span>);</pre>
<pre class="alt"><span class="lnum">  15:  </span>            section.Containers.Default.Configure(container);</pre>
<pre><span class="lnum">  16:  </span></pre>
<pre class="alt"><span class="lnum">  17:  </span>            IMonitor monitor = container.Resolve&lt;IMonitor&gt;();</pre>
<pre><span class="lnum">  18:  </span>            monitor.Alarm();</pre>
<pre class="alt"><span class="lnum">  19:  </span></pre>
<pre><span class="lnum">  20:  </span>            Console.ReadLine();</pre>
<pre class="alt"><span class="lnum">  21:  </span>        }</pre>
<pre><span class="lnum">  22:  </span>    }</pre>
<pre class="alt"><span class="lnum">  23:  </span>}</pre>
</div>
<p><!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>编译运行结果：<br />
<img class="alignnone" style="display: block; margin-left: auto; margin-right: auto;" src="/pics/unity/3.jpg" alt="" width="424" height="99" /></p>
<p>使用配置文件，还有许多方便的地方，比如对于程序的扩展而言，新增的模块不再需要修改已编译好的程序，而只需要修改配置文件就可以方便的实现新模块的注册，对于系统的稳定性和可维护性都非常有好处。</p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2009年04月28日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm" title="Unity 学习笔记(3) &#8212; 生命周期管理">Unity 学习笔记(3) &#8212; 生命周期管理</a> (0)</li><li>2009年04月23日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm" title="Unity 学习笔记(1) &#8212; Unity简介及简单使用">Unity 学习笔记(1) &#8212; Unity简介及简单使用</a> (0)</li><li>2004年12月26日 -- <a href="http://www.xiaozhou.net/vcdevelopment/information-to-be-specified-file-2004-12-26.htm" title="得到指定文件的信息">得到指定文件的信息</a> (2)</li><li>2004年11月29日 -- <a href="http://www.xiaozhou.net/vcdevelopment/to-determine-whether-a-folder-or-file-2004-11-29.htm" title="判断是否为文件夹或者文件">判断是否为文件夹或者文件</a> (0)</li><li>2004年10月26日 -- <a href="http://www.xiaozhou.net/vcdevelopment/load-images-from-the-file-2004-10-26.htm" title="从文件装载图象">从文件装载图象</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Unity 学习笔记(1) &#8212; Unity简介及简单使用</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm#comments</comments>
		<pubDate>Thu, 23 Apr 2009 21:02:31 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[unity]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[简介]]></category>
		<category><![CDATA[简单使用]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=215</guid>
		<description><![CDATA[Unity是微软Patterns &#38; Practices团队所开发的一个轻量级的，并且可扩展的依赖注入(Dependency Injection)容器，它支持常用的三种依赖注入方式：构造器注入(Constructor Injection)、属性注入(Property Injection)，以及方法调用注入(Method Call Injection).现在Unity最新的版本的1.2版，可以在微软的开源站点http://unity.codeplex.com下载最新的发布版本和文档。通过使用Unity，我们能轻松构建松耦合结构的程序，从而让整个程序框架变得清晰和易于维护。 在平常的软件编码过程中，程序的逻辑往往很复杂，尤其是大型项目的开发中，一个模块常常会去引用其他的模块，假设我们有一个监控器类，用来监控CPU的温度，当温度达到预警的范围时，监控器有一个报警的方法，方法里面通过短信提醒器，以发送短信的方式通知维护人员。于是就出现了下面这样一段最为常见的代码： 1: public class Monitor 2: { 3: public void Alarm() 4: { 5: SMSNotify notify = new SMSNotify(); 6: notify.Send(); 7: } 8: } 在Monitor类中，直接引用到了一个短信提醒器的类，这是最为不灵活和最不易于扩展的一种方式。或许我们想到了面向接口编程，利用多态的好处，可以提供灵活的不同子类的实现，增加代码扩展性等等。但是说到底，接口一定是需要实现的，也就是如下语句迟早要执行： 1: public void Alarm() 2: { 3: INotify notify = new SMSNotify(); 4: notify.Send(); 5: } 这样看来，在实现INotify这个接口的时候，仍然需要具体的类来实现，而这样的代码在程序编译的时候就已经固定下来，如果以后需要使用新的提醒器，仍旧需要修改源代码并重新编译。并且在我们的Monitor类中，明显依赖SMSNotify类，二者之间的耦合度非常紧密。因此Ioc(控制反转)模式被提出用来解决这种问题，也即把接口的具体实现延缓到运行时，接口的实现类是在运行时被装载的。这样，就算有了新的实现类，也不需要更改调用者的代码(可以在Unity中使用配置文件的方式实现)。这种Ioc模式可以被形象的比喻为：接口就像一个空壳，而在具体实现时，向这个空壳注入内容，而让它成为一个真正的实体。这种模式也被形象的称为：依赖注入。通过使用Unity，我们能构建松耦合的软件，并且对象之间相互关联的细节，我们也不必关心，可以交由依赖注入容器全权负责。 前面也提到了依赖注入常用的三种形式：构造器注入、属性注入和方法调用注入，我们可以通过例子来实现这三种形式的注入。还是以上面的场景为例，我们的几个类和接口如下图： 1.Constructor Injection IMonitor接口定义： [...]]]></description>
			<content:encoded><![CDATA[<p>Unity是微软Patterns &amp; Practices团队所开发的一个轻量级的，并且可扩展的依赖注入(Dependency Injection)容器，它支持常用的三种依赖注入方式：构造器注入(Constructor Injection)、属性注入(Property Injection)，以及方法调用注入(Method Call Injection).现在Unity最新的版本的1.2版，可以在微软的开源站点http://unity.codeplex.com下载最新的发布版本和文档。通过使用Unity，我们能轻松构建松耦合结构的程序，从而让整个程序框架变得清晰和易于维护。</p>
<p>在平常的软件编码过程中，程序的逻辑往往很复杂，尤其是大型项目的开发中，一个模块常常会去引用其他的模块，假设我们有一个监控器类，用来监控CPU的温度，当温度达到预警的范围时，监控器有一个报警的方法，方法里面通过短信提醒器，以发送短信的方式通知维护人员。于是就出现了下面这样一段最为常见的代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> Monitor</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>       <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre><span class="lnum">   4:  </span>       {</pre>
<pre class="alt"><span class="lnum">   5:  </span>               SMSNotify notify = <span class="kwrd">new</span> SMSNotify();</pre>
<pre><span class="lnum">   6:  </span>               notify.Send();</pre>
<pre class="alt"><span class="lnum">   7:  </span>        }</pre>
<pre><span class="lnum">   8:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --> <!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>在Monitor类中，直接引用到了一个短信提醒器的类，这是最为不灵活和最不易于扩展的一种方式。或许我们想到了面向接口编程，利用多态的好处，可以提供灵活的不同子类的实现，增加代码扩展性等等。但是说到底，接口一定是需要实现的，也就是如下语句迟早要执行：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>       INotify notify = <span class="kwrd">new</span> SMSNotify();</pre>
<pre><span class="lnum">   4:  </span>       notify.Send();</pre>
<pre class="alt"><span class="lnum">   5:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>这样看来，在实现INotify这个接口的时候，仍然需要具体的类来实现，而这样的代码在程序编译的时候就已经固定下来，如果以后需要使用新的提醒器，仍旧需要修改源代码并重新编译。并且在我们的Monitor类中，明显依赖SMSNotify类，二者之间的耦合度非常紧密。因此Ioc(控制反转)模式被提出用来解决这种问题，也即把接口的具体实现延缓到运行时，接口的实现类是在运行时被装载的。这样，就算有了新的实现类，也不需要更改调用者的代码(可以在Unity中使用配置文件的方式实现)。这种Ioc模式可以被形象的比喻为：接口就像一个空壳，而在具体实现时，向这个空壳注入内容，而让它成为一个真正的实体。这种模式也被形象的称为：依赖注入。通过使用Unity，我们能构建松耦合的软件，并且对象之间相互关联的细节，我们也不必关心，可以交由依赖注入容器全权负责。</p>
<p>前面也提到了依赖注入常用的三种形式：构造器注入、属性注入和方法调用注入，我们可以通过例子来实现这三种形式的注入。还是以上面的场景为例，我们的几个类和接口如下图：</p>
<p><a href="/pics/unity/1.jpg"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border-width: 0px;" title="1" src="/pics/unity/1.jpg" border="0" alt="1" width="551" height="334" /></a></p>
<p>1.Constructor Injection</p>
<p>IMonitor接口定义：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">interface</span> IMonitor</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">void</span> Alarm();</pre>
<pre><span class="lnum">   4:  </span>}</pre>
</div>
<p>Monitor类：</p>
<div class="csharpcode">
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">private</span> INotify notify;</pre>
<pre><span class="lnum">   4:  </span></pre>
<pre class="alt"><span class="lnum">   5:  </span>    <span class="kwrd">public</span> Monitor(INotify n)</pre>
<pre><span class="lnum">   6:  </span>    {</pre>
<pre class="alt"><span class="lnum">   7:  </span>        notify = n;</pre>
<pre><span class="lnum">   8:  </span>    }</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre class="alt"><span class="lnum">  11:  </span>    {</pre>
<pre><span class="lnum">  12:  </span>        notify.Send();</pre>
<pre class="alt"><span class="lnum">  13:  </span>    }</pre>
<pre><span class="lnum">  14:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>INotify接口定义：</p>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">interface</span> INotify</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">void</span> Send();</pre>
<pre><span class="lnum">   4:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>EmailNotify类：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> EmailNotify : INotify</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Send()</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        Console.WriteLine(<span class="str">"Send Email Notify..."</span>);</pre>
<pre><span class="lnum">   6:  </span>    }</pre>
<pre class="alt"><span class="lnum">   7:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>SMSNotify类：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> SMSNotify : INotify</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Send()</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        Console.WriteLine(<span class="str">"Send SMS Notify..."</span>);</pre>
<pre><span class="lnum">   6:  </span>    }</pre>
<pre class="alt"><span class="lnum">   7:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>可以看到，在Monitor类的构造函数里面，传入的参数是一个INotify接口类型，Alarm方法，调用了实现类的Send方法，但具体调用哪一个实现类的Send方法，只有在注入实体后才知道。Unity容器中，通常使用RegisterType和Resolve方法来分别注册和获取实例，并且这两个方法有很多泛型和非泛型的重载，具体的类型和参数，可以参考Unity的官方帮助文档。</p>
<p>现在我们向Monitor的构造函数注入实现INotify接口的实例:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   4:  </span>    container.RegisterType&lt;IMonitor, Monitor&gt;().RegisterType&lt;INotify, SMSNotify&gt;();</pre>
<pre class="alt"><span class="lnum">   5:  </span></pre>
<pre><span class="lnum">   6:  </span>    IMonitor monitor = container.Resolve&lt;IMonitor&gt;();</pre>
<pre class="alt"><span class="lnum">   7:  </span>    monitor.Alarm();</pre>
<pre><span class="lnum">   8:  </span></pre>
<pre class="alt"><span class="lnum">   9:  </span>    Console.ReadLine();</pre>
<pre><span class="lnum">  10:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>代码中我们注入的INotify实例是SMSNotify类的实例，然后调用monitor.Alrarm()，里面会调用notify.Send().<br />
运行查看结果：<br />
<a href="/pics/unity/2.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="2" src="/pics/unity/2.jpg" border="0" alt="2" width="421" height="98" /></a><br />
上面是针对单个构造函数的情况，如果有多个构造函数，需要指明哪个构造函数是需要被注入的,也即需要在指定被注入的构造函数加上attribute:InjectionConstructor</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> Monitor(INotify n, <span class="kwrd">string</span> name)</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    notify = n;</pre>
<pre><span class="lnum">   4:  </span>}</pre>
<pre class="alt"><span class="lnum">   5:  </span></pre>
<pre><span class="lnum">   6:  </span>[InjectionConstructor]</pre>
<pre class="alt"><span class="lnum">   7:  </span><span class="kwrd">public</span> Monitor(INotify n)</pre>
<pre><span class="lnum">   8:  </span>{</pre>
<pre class="alt"><span class="lnum">   9:  </span>    notify = n;</pre>
<pre><span class="lnum">  10:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行后可得到一样的结果.</p>
<p>2.Property Injection</p>
<p>通过属性注入，我们需要加上attribute: Dependency，使得Unity容器在获取类对象实例时，自动实例化该属性所依赖的对象，并注入到属性中。</p>
<p>修改Monitor类,实现下面的代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    [Dependency]</pre>
<pre><span class="lnum">   4:  </span>    <span class="kwrd">public</span> INotify Notify { get; set; }</pre>
<pre class="alt"><span class="lnum">   5:  </span></pre>
<pre><span class="lnum">   6:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre class="alt"><span class="lnum">   7:  </span>    {</pre>
<pre><span class="lnum">   8:  </span>        Notify.Send();</pre>
<pre class="alt"><span class="lnum">   9:  </span>    }</pre>
<pre><span class="lnum">  10:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --> <!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>再在Main函数里面，修改原有的代码，这次我们让容器注入EmailNotify实例：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>container.RegisterType&lt;INotify, EmailNotify&gt;();</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行查看结果：<br />
<a href="/pics/unity/3.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="3" src="/pics/unity/3.jpg" border="0" alt="3" width="424" height="99" /></a> 还有一个比较方便的地方，可以为Dependency特性指定名称，这样，在注入时，会将RegisterType所指定的对应名称的实体进行注入，例如：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>    <span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor</pre>
<pre><span class="lnum">   2:  </span>    {</pre>
<pre class="alt"><span class="lnum">   3:  </span>        [Dependency(<span class="str">"SMS"</span>)]</pre>
<pre><span class="lnum">   4:  </span>        <span class="kwrd">public</span> INotify Notify { get; set; }</pre>
<pre class="alt"><span class="lnum">   5:  </span></pre>
<pre><span class="lnum">   6:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre class="alt"><span class="lnum">   7:  </span>        {</pre>
<pre><span class="lnum">   8:  </span>            Notify.Send();</pre>
<pre class="alt"><span class="lnum">   9:  </span>        }</pre>
<pre><span class="lnum">  10:  </span>    }</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>修改Main函数，在RegisterType函数中指定注入名称:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;(<span class="str">"Email"</span>);</pre>
<pre><span class="lnum">   2:  </span>            container.RegisterType&lt;INotify, SMSNotify&gt;(<span class="str">"SMS"</span>);</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行查看结果：<br />
<a href="/pics/unity/2.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="2" src="/pics/unity/2.jpg" border="0" alt="2" width="421" height="98" /></a></p>
<p>3.Method Call Injection</p>
<p>Method Call Injection注入的时机和Constructor Injection有一定的区别，构造函数注入，是在容器创建实例的时候，而方法调用注入，是在方法被调用的时候。实现方法调用注入，需要在指定注入的方法前加上attribute: InjectionMethod</p>
<p>修改Monitor类的代码如下：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>    <span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor</pre>
<pre><span class="lnum">   2:  </span>    {</pre>
<pre class="alt"><span class="lnum">   3:  </span>        <span class="kwrd">private</span> INotify notify;</pre>
<pre><span class="lnum">   4:  </span></pre>
<pre class="alt"><span class="lnum">   5:  </span>        [InjectionMethod]</pre>
<pre><span class="lnum">   6:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> GetNotify(INotify n)</pre>
<pre class="alt"><span class="lnum">   7:  </span>        {</pre>
<pre><span class="lnum">   8:  </span>            notify = n;</pre>
<pre class="alt"><span class="lnum">   9:  </span>        }</pre>
<pre><span class="lnum">  10:  </span></pre>
<pre class="alt"><span class="lnum">  11:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre><span class="lnum">  12:  </span>        {</pre>
<pre class="alt"><span class="lnum">  13:  </span>            notify.Send();</pre>
<pre><span class="lnum">  14:  </span>        }</pre>
<pre class="alt"><span class="lnum">  15:  </span>    }</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>在程序运行时，容器会自动实例化GetNotify方法所依赖的对象，并自动调用该方法，将其注入到方法中。</p>
<p>Main函数如下：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   2:  </span>        {</pre>
<pre class="alt"><span class="lnum">   3:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   4:  </span>            container.RegisterType&lt;IMonitor, Monitor&gt;();</pre>
<pre class="alt"><span class="lnum">   5:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;();</pre>
<pre><span class="lnum">   6:  </span></pre>
<pre class="alt"><span class="lnum">   7:  </span>            IMonitor monitor = container.Resolve&lt;IMonitor&gt;();</pre>
<pre><span class="lnum">   8:  </span>            monitor.Alarm();</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>            Console.ReadLine();</pre>
<pre class="alt"><span class="lnum">  11:  </span>        }</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行查看结果：</p>
<p><a href="/pics/unity/3.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="3" src="/pics/unity/3.jpg" border="0" alt="3" width="424" height="99" /></a></p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2009年04月28日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm" title="Unity 学习笔记(3) &#8212; 生命周期管理">Unity 学习笔记(3) &#8212; 生命周期管理</a> (0)</li><li>2009年04月25日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm" title="Unity 学习笔记(2) &#8212; 配置文件的使用">Unity 学习笔记(2) &#8212; 配置文件的使用</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
