最近准備用Unity來改良系統。
做了一些小測試,拿出來與大家分享一下。
01 using System;
02 using System.Text;
03 using System.Collections.Generic;
04 using System.Linq;
05 using Microsoft.VisualStudio.TestTools.UnitTesting;
06 using Microsoft.Practices.Unity;
07 using System.Diagnostics;
08
09 namespace MyTest
10 {
11
12 [TestClass]
13 public class UnitTest1
14 {
15
16 IUnityContainer mContainer;
17 [TestInitialize()]
18 public void MyTestInitialize() {
19 mContainer = new UnityContainer();
20 }
21
22 class DependencyObject
23 {
24 public string Value { get; set; }
25 }
26
27 class LogicObject
28 {
29 private readonly DependencyObject mDependency;
30 public LogicObject(DependencyObject dependency)
31 {
32 mDependency = dependency;
33 }
34
35 public DependencyObject Dependency
36 {
37 get { return mDependency; }
38 }
39 }
40
41 [TestMethod]
42 public void TestNormal()
43 {
44 var dependency = new DependencyObject();
45 dependency.Value = "Dependency";
46
47 var logicObj = new LogicObject(dependency);
48
49 Assert.AreSame(logicObj.Dependency, dependency);
50 }
51
52 [TestMethod]
53 public void TestUnityContainer()
54 {
55 var dependency = new DependencyObject();
56 dependency.Value = "Dependency";
57
58 mContainer.RegisterInstance(typeof(DependencyObject), dependency);
59 mContainer.RegisterType<LogicObject>();
60
61 var logicObj = mContainer.Resolve<LogicObject>();
62
63 Assert.AreSame(logicObj.Dependency, dependency);
64 }
65 }
66 }
TestNormal展示了傳統的對象構造方式
TestUnityContainer展示了使用Unity後,對象的構造方式。
在當前的編程實踐中,對象之間的依賴性變得復雜,要構造一個對象已經不是一件簡單的事情,例如上面的例子,LogicObject對 DependencyObject有依賴,所以在構造LogicObject之前,還不得不構造DependencyObject。而現實的情況可能還要復雜,DependencyObject本身可能也依賴於其它對象。所以要構造LogicObject變得更加復雜。為了解決這個問題,誕生了很多依賴注入框架。Unity就是其中一種,不過它也是通過ObjectBuilder來實現的。
說到這裡,很多人會質疑這種自動構造的過程,認為這個過程難以控制。就像TestNormal一樣,在構造LogicObject時,我們可以從代碼上了解到LogicObject對DependencyObject有依賴。而在TestUnityContainer中,這種依賴就不明顯。
關於這個問題,我不能回避,我會在今後討論它。