不一样的依赖注入 创建周期的加入
首先创建一个依赖提供类,其中这个类里面包含需要创建的实例(服务)类型以及这个服务的生命周期:.
1public class Dependency
2{
3 // 构造函数赋值,提供服务类型以及生命周期
4 public Dependency(Type type,SelfLifeTime selfLifeTime)
5 {
6 Type = type;
7 LifeTime = selfLifeTime;
8 }
9
10 public Type Type { get; set; }
11 public SelfLifeTime LifeTime { get; set; } // SelfLifeTime 是一个枚举类型,包含单例和瞬时
12 public object Implementation { get; set; } // 服务具体实现类
13 public bool Implemented { get; set; } // 判断是否被实现
14
15 // 添加实现类
16 public void AddImplementation(object i)
17 {
18 this.Implementation = i;
19 this.Implemented = true;
20 }
21}
1// 生命周期枚举
2public enum SelfLifeTime
3{
4 Singleton=0, // 单例
5 Transient=1 // 瞬态
6}
容器改造
1public class Container
2{
3 List<Type> _lists;
4 List<Dependency> dependencies; // Dependency的容器集合
5 public Container()
6 {
7 _lists = new List<Type>();
8 dependencies = new List<Dependency>(); // 初始化 防止空引用
9 }
10
11 // 添加单例
12 public void AddSingleton<T>()
13 {
14 dependencies.Add(new Dependency(typeof(T),SelfLifeTime.Singleton));
15 }
16
17 // 添加瞬态
18 public void AddTransient<T>()
19 {
20 dependencies.Add(new Dependency(typeof(T), SelfLifeTime.Transient));
21 }
22
23 public void Add<T>()
24 {
25 _lists.Add(typeof(T));
26 }
27
28 public void Add(Type type)
29 {
30 _lists.Add(type);
31 }
32
33 public Type GetDenpendencyType(Type type)
34 {
35 return _lists.FirstOrDefault(x=>x.Name == type.Name);
36 }
37
38 // 得到容器中指定类型
39 public Dependency GetDependencyLifeTimeType(Type type)
40 {
41 return dependencies.FirstOrDefault(x=>x.Type.Name == type.Name);
42 }
43}
创建容器,生成服务,验证周期
1var container = new Container(); // 创建容器
2container.AddTransient<Test>(); // 将Test 创建为瞬态
3container.AddTransient<Test2>(); // 将Test2 创建为瞬态
4container.AddTransient<Test3>(); // 将Test3 创建为瞬态
5
6var service = new ContainerService(container);
7var test = service.GenerateServiceFixed<Test>(); // 创建Test 实例服务
8var test3 = service.GenerateServiceFixed<Test3>(); //创建 Test3 实例服务
9var test4 = service.GenerateServiceFixed<Test3>(); // 创建 Test3 实例服务
10test.PrintTest1();
11test3.PrintTest3();
12test4.PrintTest3();
具体实现效果参见视频讲解~