依赖注入 概念演示示例

简介:

最近开始研究依赖注入。刚刚开始研究这个东西,遇到不少问题。首先,概念就理解的不是很清楚,更不要说代码实现点什么了。

Google之下找到一片好文:http://tech.it168.com/w/d/2007-07-10/200707100933943.shtml 

看了下,对依赖注入理解清晰了不少。

      不过,感觉作者为了简单,把所有的代码文件都放在了一个dll中。我觉得这样并不会

对读者理解依赖注入有帮助,所以重新整理了下,放在这里和大家分享。欢迎提出批评意见!

代码 

以下是代码清单:

接口层 

复制代码
1 namespace  IoCTest.Interface
2 {
3    public interface IWeatherReader
4    {
5        string Current getset; }
6    }

7}
复制代码

 

接口的实现部分

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5 using  IoCTest.Interface;
 6
 7 namespace  IoCTest.Implementation
 8 {
 9    public class WeatherReaderImpl : IWeatherReader
10    {
11        private string _weather;
12        public WeatherReaderImpl(string weather)
13        {
14            this._weather = weather;
15        }

16
17        public string Current
18        {
19            get return _weather; }
20            set { _weather = value; }
21        }

22    }

23}
复制代码


依赖注入容器

类型字典接口

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5
 6 namespace  IoCTest.Container
 7 {
 8    public interface ITypeMap
 9    {
10        TypeConstructor this[Type type] get; }
11    }

12}
复制代码

 

类型字典接口的实现


复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5 using  IoCTest.Implementation;
 6 using  IoCTest.Interface;
 7
 8 namespace  IoCTest.Container
 9 {
10    public class MemoryTypeMap : ITypeMap
11    {
12        private Dictionary<Type, TypeConstructor> _dicType = new Dictionary<Type, TypeConstructor>();
13        private static ITypeMap _typeMapInstance;
14
15        private MemoryTypeMap() { }
16
17        static MemoryTypeMap()
18        {
19            MemoryTypeMap singleton = new MemoryTypeMap();
20            singleton._dicType.Add(typeof(IWeatherReader), new TypeConstructor(typeof(WeatherReaderImpl), "s"));
21            _typeMapInstance = singleton;
22        }

23
24        public static ITypeMap Instance
25        {
26            get return _typeMapInstance; }
27        }

28
29        public TypeConstructor this[Type type]
30        {
31            get
32            {
33                TypeConstructor constructor;
34
35                if (!_dicType.TryGetValue(type, out constructor))
36                {
37                    return null;
38                }

39                else
40                {
41                    return constructor;
42                }

43            }

44        }

45    }

46}
复制代码

类型示例创建相关类

 

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5
 6 namespace  IoCTest.Container
 7 {
 8    public class TypeConstructor
 9    {
10        private Type _type;
11        private object[] _parameters;
12
13        public Type GetType
14        {
15            get return _type; }
16        }

17
18        public object[] Parameters
19        {
20            get return _parameters; }
21        }

22
23        public TypeConstructor(Type type, params object[] parameters)
24        {
25            _type = type;
26            _parameters = parameters;
27        }

28
29        public TypeConstructor(Type type):this(type,null)
30        {
31            
32        }

33    }

34}
复制代码

 

实例生成类

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5
 6 namespace  IoCTest.Container
 7 {
 8    public class Assembler<T> where T : class
 9    {
10        private static ITypeMap _typeMap = MemoryTypeMap.Instance;
11
12        public T Create()
13        {
14            TypeConstructor constructor = _typeMap[typeof(T)];
15
16            if (constructor != null)
17            {
18                if (constructor.Parameters == null)
19                    return (T)Activator.CreateInstance(constructor.GetType);
20                else
21                    return (T)Activator.CreateInstance(constructor.GetType, constructor.Parameters); 
22            }

23            else
24            {
25                return null;
26            }

27        }

28    }

29}

30
复制代码


调用模块

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5 using  IoCTest.Interface;
 6
 7 namespace  IoCTest.Client
 8 {
 9    public class Client
10    {
11        private IWeatherReader _reader;
12        public Client(IWeatherReader reader)
13        {
14            this._reader = reader;
15        }

16
17        public string Weather
18        {
19            get return _reader.Current; }
20        }

21    }

22}
复制代码

 

 Console调用部分

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5 using  IoCTest.Container;
 6 using  IoCTest.Interface;
 7
 8 namespace  IoCTest
 9 {
10    class Program
11    {
12        static void Main(string[] args)
13        {
14            IWeatherReader reader = new Assembler<IWeatherReader>().Create();
15            IoCTest.Client.Client client = new IoCTest.Client.Client(reader);
16
17            Console.WriteLine(reader.Current);
18        }

19    }

20}
复制代码

 

 NUnit测试用代码

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5 using  IoCTest.Client;
 6 using  IoCTest.Container;
 7 using  IoCTest.Implementation;
 8 using  IoCTest.Interface;
 9 using  NUnit.Framework;
10
11 namespace  UnitTest
12 {
13    [TestFixture]
14    public class UnitTest
15    {
16        [SetUp]
17        public void Init()
18        {
19            
20        }

21
22        //[Test]
23        //public void TestWhatWeather()
24        //{
25        //    IoCTest.Client.Client client = new IoCTest.Client.Client();
26
27        //    Assert.AreEqual(client.Weather, "unknown");
28        //}
29
30        [Test]
31        public void TestIsNull()
32        {
33            IWeatherReader reader = new Assembler<IWeatherReader>().Create();
34            Assert.IsNotNull(reader);
35            Assert.AreEqual(typeof(WeatherReaderImpl), reader.GetType()); 
36        }

37
38        [Test]
39        public void ConstructorTest()
40        {
41            IWeatherReader reader = new Assembler<IWeatherReader>().Create();
42            IoCTest.Client.Client client = new IoCTest.Client.Client(reader);
43            Assert.IsNotNull(client); 
44        }

45    }

46}
复制代码

 

 

 

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/archive/2009/02/06/1385437.html
相关文章
|
8月前
|
缓存 监控 Java
Hysterix的概念、作用、使用方法
Hysterix的概念、作用、使用方法
75 0
|
8月前
|
JSON 前端开发 Java
SpringBoot - 统一格式封装及高阶全局异常处理
SpringBoot - 统一格式封装及高阶全局异常处理
101 0
|
Python
学习Python语言的语法,例如函数、类、模块、循环中的类详解
学习Python语言的语法,例如函数、类、模块、循环中的类详解
71 1
|
设计模式 NoSQL Java
如何用最简单的方式解释依赖注入?
如何用最简单的方式解释依赖注入?
84 0
|
设计模式 算法 安全
C++常用的11种设计模式解释及示例
C++常用的11种设计模式解释及示例
|
设计模式 缓存 算法
Java设计模式:深入解析与应用示例
引言 设计模式是一种在特定上下文中反复出现的可重用解决方案,用于处理软件设计中常见的问题。掌握设计模式不仅可以帮助我们编写出更优雅、更易于理解和维护的代码,而且也是Java面试中的常考知识点。在本文中,我们将探讨几种常见的设计模式,包括它们的定义、使用场景和Java实现。
307 0
|
前端开发
前端学习案例7-组合继承
前端学习案例7-组合继承
78 0
前端学习案例7-组合继承
|
前端开发
前端学习案例6-组合继承
前端学习案例6-组合继承
63 0
前端学习案例6-组合继承
|
前端开发
前端学习案例14-代码的封装1
前端学习案例14-代码的封装1
90 0
前端学习案例14-代码的封装1
|
前端开发
前端学习案例2-对象的封印
前端学习案例2-对象的封印
43 0
前端学习案例2-对象的封印