且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

依赖注入 概念演示示例

更新时间:2022-09-22 13:01:28

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

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: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!

















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/archive/2009/02/06/1385437.html,如需转载请自行联系原作者