[不一样的依赖注入].NET容器与服务周期的结合

不一样的依赖注入 创建周期的加入

首先创建一个依赖提供类,其中这个类里面包含需要创建的实例(服务)类型以及这个服务的生命周期:.

 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();

具体实现效果参见视频讲解~