背景
在.Net平台中,几乎所有的Ioc容器在注册方面都不一致,使用Unity需要注意几个事项,咱们通过实验进行验证一下。
验证的内容:
- 集合的获取。
- 生命周期管理。
实验
代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using Microsoft.Practices.Unity; 8 9 namespace UnityStudy10 {11 class Program12 {13 static void Main(string[] args)14 {15 UnityContainer container = new UnityContainer();16 17 container.RegisterType(new PerThreadLifetimeManager());18 container.RegisterType ("A");19 container.RegisterType ("B");20 container.RegisterType ("C");21 container.RegisterType ();22 container.RegisterType ();23 24 Console.WriteLine(container.ResolveAll ().Count());25 //输出:326 27 Console.WriteLine(container.Resolve ().GetHashCode());28 Console.WriteLine(container.Resolve ().GetHashCode());29 30 Console.WriteLine(container.Resolve ().GetHashCode());31 Console.WriteLine(container.Resolve ().GetHashCode());32 33 Console.WriteLine(container.Resolve ().GetHashCode());34 Console.WriteLine(container.Resolve ().GetHashCode());35 //输出:上边六行输出内容一样36 37 Console.WriteLine(container.ResolveAll ().Last().GetHashCode());38 Console.WriteLine(container.ResolveAll ().Last().GetHashCode());39 //输出:输出两行完全不一样40 }41 }42 43 public interface ITest { }44 45 public interface IOther { }46 47 public class Test : ITest, IOther { }48 49 public class TestA : ITest { }50 51 public class TestB : ITest { }52 }
输出
结论
- ResolveAll只返回命名注册。
- 生命周期和具体类型+注册的名字有关系。
备注
使用Unity获取具体类型是不用注册的,有些Ioc容器要求所有类型都必须先注册才能获取。