IOC--Unity
IOC--控制反转 =》 目的
DI--依赖注入 =》过程 通过反射的形式将所有需要的对象展示出来
一般情况全局注册随用随取
Unity实例
1,实例Untiy 容器 2 注册类型 3 获取实例
1 //IUnityContainer container = new UnityContainer();//1 实例化容器 2 //container.RegisterType<IPhone, AndroidPhone>();//2 注册类型 3 ////container.RegisterType<AbstractPad, ApplePad>(); 4 //container.RegisterType<ApplePad, ApplePadChild>(); 5 //container.RegisterInstance<AbstractPad>(new ApplePadChild()); 6 //IPhone iphone = container.Resolve<IPhone>();//3 获取实例 7 //AbstractPad abstractPad = container.Resolve<AbstractPad>(); 8 //ApplePad applePad = container.Resolve<ApplePad>();
1 ////既然对象都是从我这里获取的,我的地盘听我的,我就可以做一些扩展管理,生命周期管理 2 //IUnityContainer container = new UnityContainer(); 3 ////默认瞬时生命周期:每次都是构造一个新的 4 ////container.RegisterType<AbstractPad, ApplePad>(); 5 ////container.RegisterType<AbstractPad, ApplePad>(new TransientLifetimeManager()); 6 7 ////全局单例:全局就只有一个该类型实例 8 ////非强制性,只有通过容器获取才是单例;项目中一般推荐容器单例而不是自己写单例 9 ////container.RegisterType<AbstractPad, ApplePad>(new SingletonLifetimeManager()); 10 ////AbstractPad pad1 = container.Resolve<AbstractPad>(); 11 ////AbstractPad pad2 = container.Resolve<AbstractPad>(); 12 ////Console.WriteLine(object.ReferenceEquals(pad1, pad2)); 13 14 ////线程单例:同一个线程就只有一个实例,不同线程就是不同实例 15 //container.RegisterType<AbstractPad, ApplePad>(new PerThreadLifetimeManager()); 16 //AbstractPad pad1 = null; 17 //AbstractPad pad2 = null; 18 //AbstractPad pad3 = null; 19 20 //Action act1 = new Action(() => 21 // { 22 // pad1 = container.Resolve<AbstractPad>(); 23 // Console.WriteLine($"pad1由线程id={Thread.CurrentThread.ManagedThreadId}"); 24 // }); 25 //var result1 = act1.BeginInvoke(null, null); 26 27 //Action act2 = new Action(() => 28 //{ 29 // pad2 = container.Resolve<AbstractPad>(); 30 // Console.WriteLine($"pad2由线程id={Thread.CurrentThread.ManagedThreadId}"); 31 //}); 32 //var result2 = act2.BeginInvoke(t => 33 //{ 34 // pad3 = container.Resolve<AbstractPad>(); 35 // Console.WriteLine($"pad3由线程id={Thread.CurrentThread.ManagedThreadId}"); 36 // Console.WriteLine($"object.ReferenceEquals(pad2, pad3)={object.ReferenceEquals(pad2, pad3)}"); 37 //}, null); 38 39 //act1.EndInvoke(result1); 40 //act2.EndInvoke(result2); 41 42 //Console.WriteLine($"object.ReferenceEquals(pad1, pad2)={object.ReferenceEquals(pad1, pad2)}"); 43 ////HierarchicalLifetimeManager 分级容器单例, 44 ////var childContainer = container.CreateChildContainer(); 45 46 ////ExternallyControlledLifetimeManager 外部可释放单例 47 ////PerResolveLifetimeManager 循环引用

浙公网安备 33010602011771号