.NetCore IOC容器练习
Microsoft.Extensions.DependencyInjection
//添加Nuget包Microsoft.Extensions.DependencyInjection var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient<IBase, TheyClass>(); serviceCollection.AddSingleton<IBase, MyClass>(); serviceCollection.AddScoped<IBase, YouClass>(); var serviceProvider = serviceCollection.BuildServiceProvider(); serviceProvider.GetService<IBase>().SayHello(); foreach (var item in serviceProvider.GetServices<IBase>()) { item.SayHello(); } serviceProvider.GetService<IBase>().SayHello(); foreach (var item in serviceProvider.GetServices<IBase>()) { item.SayHello(); } //仅注册过的方可拿到,此处MyClass未注册,GetService为Null,抛异常 serviceProvider.GetService<MyClass>().SayHello(); //仅注册过的方可拿到,此处MyClass未注册,GetRequiredService提示未注册,抛异常 serviceProvider.GetRequiredService<MyClass>().SayHello();
Castle.Windsor:
//需要添加Nuget包:Castle.Windsor.MsDependencyInjection和Castle.Core //需要添加引用:Castle.Windsor和Castle.Windsor.MsDependencyInjection //创建容器 Castle.Windsor.WindsorContainer container = new Castle.Windsor.WindsorContainer(); //旧版可以适用如下注册container.AddComponent<IBase, MyClass>(); //容器注册组件,并且管理组件的生命周期 container.Register(Component.For<IBase>().ImplementedBy<MyClass>().LifestyleSingleton().Named("MyClass")); container.Register(Component.For<IBase>().ImplementedBy<YouClass>().LifestyleScoped().Named("YouClass")); container.Register(Component.For<IBase>().ImplementedBy<TheyClass>().LifestyleTransient().Named("TheyClass")); container.BeginScope(); //组件激活,拿到组件实例 container.Resolve<IBase>("MyClass").SayHello(); //声明周期为Scoped的,必须执行BeginScoped后开始调用,在下一个BeginScope调用之前,只实例化一次 container.BeginScope(); foreach (var item in container.ResolveAll<IBase>()) { item.SayHello(); } container.Resolve<IBase>("YouClass").SayHello(); //声明周期为Scoped的,必须执行BeginScoped后开始调用,在下一个BeginScope调用之前,只实例化一次 container.BeginScope(); foreach (var item in container.ResolveAll<IBase>()) { item.SayHello(); } //容器释放 container.Dispose();