日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity浅析

發布時間:2023/12/9 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity浅析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在分析PRISM項目的時候, 發現里面用到了Unity 這個Component, 主要用于依賴注入的。由于對其不熟悉,索性分析了一下,記載在此,以作備忘。

任何事物的出現,總有它獨特的原因,Unity也是如此。

在Unity產生之前,我們是這么做的

在遠古的時候,當我們需要在一個類A中引用另一個類B的時候,總是將類B的實例放置到類A的構造函數中,以便在初始化類A的時候,得到類B的實例。

1 public class A 2 { 3 B b; 4 public A() 5 { 6 B = new B(); 7 } 8 }

?

但是,當項目稍微大一點的時候,維護起來就顯得異常吃力,尤其是當有Code Change的時候,如果類B有了一些修改(比如加入了帶參構造等等),那么這種修改和測試將是異常難受的。

所以,為了解決最原始的問題,我們開始在類A的外部獲取類B的實例,以便能夠減輕依賴:

1 public class A 2 { 3 B b; 4 public A(B _b) 5 { 6 This.b = _b; 7 } 8 }

?

這樣,只需要在外部實例化B,然后傳入類A即可。這樣做,雖然比原始做法方便了許多,然是在類A內部,依然存在著對類B的依賴。由于類B在系統中是唯一的,所以說當有許多個類似于類B的對象需要進行初始化的時候,這種工作量…誰能夠想象呢?

有了問題,才會思考變化,于是接口開始在這方面體現他的威力了:

1 public class A 2 { 3 IMyObject myObj; 4 public A(IMyObject myObj) 5 { 6 this.myObj = myObj; 7 } 8 }

?

將相似的操作抽出來,放入接口中。現在,你就擁有了許多可以操縱的類對象(繼承了IService接口的類)。并且采用接口以后,你可以更加容易的進行開發和測試,并且維護起來也相對簡單。比如,如果你想測試接口中的DataExtracting功能,那么你完全可以寫一個類繼承自這個接口,只實現DataExtracting功能即可,簡單,方便。

在Unity產生之后,我們是這么做的

現在,Unity將這種操作更加的簡單化,我們可以理解為這樣,Unity將繼承了接口的類進行了橫切,然后提供了還原的方法:

進行依賴注入:

1 UnityContainer container = new UnityContainer(); 2 3 private void button1_Click(object sender, EventArgs e) 4 { 5 container.RegisterType<IMyObject, MyObjectFirstImplementation>(DependencyRegistrationKeys.FirstImplementation); 6 container.RegisterType<IMyObject, MyObjectSecondImplementation>(DependencyRegistrationKeys.SecondImplementation); 7 8 container.RegisterType<IMyObject, MyObjectThirdImplementation>(); 9 container.RegisterType<IMyObject, MyObjectFirstImplementation>(); 10 11 }

?

?

還原實體類:

1 public MyObjectFactory(UnityContainer unityContainer) 2 { 3 this.unityContainer = unityContainer; 4 } 5 6 public UnityContainer unityContainer; 7 8 public IMyObject Create(string objKey) 9 { 10 return unityContainer.Resolve<IMyObject>(objKey); 11 } 12

?

最后給出一個例子作為參考,這個例子主要是講解Unity如何進行注冊對象以及還原的:

實例說明

首先,我們需要有一個IMyObject接口,然后有三個類繼承自此對象:

接口:

1 namespace UnityDaemon 2 { 3 public interface IMyObject 4 { 5 string DoSomething(); 6 } 7 }

?

MyObjectFirstImplementation類:

1 namespace UnityDaemon 2 { 3 public class MyObjectFirstImplementation:IMyObject 4 { 5 public string DoSomething() 6 { 7 return "You call me ? I am the first one, I am from MyObjectFirstImplementation!! "; 8 } 9 } 10 }

?

MyObjectSecondImplementation類:

1 namespace UnityDaemon 2 { 3 public class MyObjectSecondImplementation:IMyObject 4 { 5 public string DoSomething() 6 { 7 return "You call me ? I am the second one, I am from MyObjectSecondImplementation!! "; 8 } 9 } 10 }

?

MyObjectThirdImplementation類:

1 namespace UnityDaemon 2 { 3 public class MyObjectThirdImplementation:IMyObject 4 { 5 public string DoSomething() 6 { 7 return "I am the third. Do whatever you want to ~~~"; 8 } 9 } 10 }

?

當然,這里我們還可以增加更多的類...

然后,我們需要創建一個Factory,用于根據Object名稱來還原對象:

1 using Microsoft.Practices.Unity; 2 3 namespace UnityDaemon 4 { 5 public class MyObjectFactory 6 { 7 public MyObjectFactory() { } 8 9 public MyObjectFactory(UnityContainer unityContainer) 10 { 11 this.unityContainer = unityContainer; 12 } 13 14 public UnityContainer unityContainer; 15 16 public IMyObject Create(string objKey) 17 { 18 return unityContainer.Resolve<IMyObject>(objKey); 19 } 20 } 21 }

?

這樣做完之后,我們就可以來使用了,我利用Winform做的界面,Button1用來注冊類型,Button2用來還原有名稱的對象,Button3用來還原無名稱的對象:

1 using System; 2 using System.Windows.Forms; 3 using Microsoft.Practices.Unity; 4 5 namespace UnityDaemon 6 { 7 public partial class MainFrm : Form 8 { 9 UnityContainer container; 10 11 public MainFrm() 12 { 13 InitializeComponent(); 14 container = new UnityContainer(); 15 } 16 17 private void button1_Click(object sender, EventArgs e) 18 { 19 container.RegisterType<IMyObject, MyObjectFirstImplementation>(DependencyRegistrationKeys.FirstImplementation); 20 container.RegisterType<IMyObject, MyObjectSecondImplementation>(DependencyRegistrationKeys.SecondImplementation); 21 22 container.RegisterType<IMyObject, MyObjectThirdImplementation>(); 23 container.RegisterType<IMyObject, MyObjectFirstImplementation>(); 24 25 } 26 27 private void button2_Click(object sender, EventArgs e) 28 { 29 var factory = new MyObjectFactory(container); 30 var myObj = factory.Create(DependencyRegistrationKeys.FirstImplementation); 31 string str = myObj.DoSomething(); 32 MessageBox.Show(str); 33 34 var myObj1 = factory.Create(DependencyRegistrationKeys.SecondImplementation); 35 string str1 = myObj1.DoSomething(); 36 MessageBox.Show(str1); 37 } 38 39 private void button3_Click(object sender, EventArgs e) 40 { 41 var myObj1 = container.Resolve<IMyObject>(); 42 43 MessageBox.Show(myObj1.DoSomething()); 44 } 45 } 46 }

?

這樣,當我們運行起來,先點擊Button1的時候,三個類都被注冊進了容器中。當點擊Button2的時候,顯示出來的結果和預想一樣。當點擊Button3的時候,僅僅顯示了

You call me ? I am the first one, I am from MyObjectFirstImplementation!!

原因是什么呢? 原因就在于當注冊的時候,沒有提供名稱的話,那么解析的時候,則以最后一次注冊的為準。所以這也是MyObjectThirdImplementation類中的函數沒有被執行的原因。

源碼下載

點擊這里下載

參考連接

http://stackoverflow.com/questions/4612054/wpf-prism-what-is-a-unity-container

http://blogsprajeesh.blogspot.hk/search/label/PRISM

總結

以上是生活随笔為你收集整理的Unity浅析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。