Welcome

首页 / 软件开发 / .NET编程技术 / Unity依赖注入--构造器注入

Unity依赖注入--构造器注入2011-06-23 博客园 czy最近准备用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中,这种依赖就不明显。

关于这个问题,我不能回避,我会在今后讨论它。