接口与实现关系图

1.简单使用
// 创建容器
ContainerBuilder containerBuilder = new ContainerBuilder();
// 注册抽象与具体实现
containerBuilder.RegisterType<Headphone>().As<IHeadphone>();
// 构建容器Build
IContainer container = containerBuilder.Build();
// 获取对象
IHeadphone? headphone = container.Resolve<IHeadphone>();
2.使用实例注册
ContainerBuilder containerBuilder = new ContainerBuilder();
Headphone headphone1 = new Headphone();
containerBuilder.RegisterInstance(headphone1);
IContainer container = containerBuilder.Build();
IHeadphone? headphone = container.Resolve<Headphone>();
headphone.testHeadPhone();
Console.WriteLine(object.ReferenceEquals(headphone1, headphone)); // True
3.可以注册一段创建对象的业务逻辑
IPower power1 = null;
IPower power2 = null;
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<Headphone>().As<IHeadphone>();
containerBuilder.RegisterType<Microphone>().As<IMicrophone>();
containerBuilder.Register<IPower>(context =>
{
IMicrophone microphone = context.Resolve<IMicrophone>();
power1 = new Power(microphone);
return power1;
});
IContainer container = containerBuilder.Build();
power2 = container.Resolve<IPower>();
Console.WriteLine(object.ReferenceEquals(power1,power2));
4.注册泛型
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<Headphone>().As<IHeadphone>();
containerBuilder.RegisterGeneric(typeof(List<>)).As(typeof(List<>));
IContainer container = containerBuilder.Build();
List<IHeadphone> resolve = container.Resolve<List<IHeadphone>>();
Console.WriteLine(resolve);
5.可以把Type类型作为注册的类型
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType(typeof(Headphone)).As(typeof(IHeadphone));
IContainer container = containerBuilder.Build();
IHeadphone headphone = container.Resolve<IHeadphone>();
headphone.TestHeadPhone();
6.可以注册程序集
ContainerBuilder containerBuilder = new ContainerBuilder();
Assembly assemblyInterface = Assembly.LoadFrom("Zhaoxi.IOC.Interfaces.dll");
Assembly assemblyService = Assembly.LoadFrom("Zhaoxi.IOC.Services.dll");
containerBuilder.RegisterAssemblyTypes(assemblyInterface, assemblyService).AsImplementedInterfaces(); // 在程序集中找出抽象与具体的对应关系
IContainer container = containerBuilder.Build();
IPower resolve = container.Resolve<IPower>();
7.单个抽象多个实现 这种情况会后面注册的覆盖前面的
ContainerBuilder containerBuilder = new ContainerBuilder();
/*containerBuilder.RegisterType<AndroidPhone>().As<IPhone>();
containerBuilder.RegisterType<ApplePhone>().As<IPhone>();*/
// 第一种
/*containerBuilder.RegisterType<AndroidPhone>().Named<IPhone>("AndroidPhone");
containerBuilder.RegisterType<ApplePhone>().Named<IPhone>("ApplePhone");
IContainer container = containerBuilder.Build();
IPhone resolve = container.ResolveNamed<IPhone>("AndroidPhone",new NamedParameter("Power",new Power( new Microphone( new Headphone() ) )));
resolve.Call();*/
// 第二种
containerBuilder.RegisterType<AndroidPhone>().Keyed<IPhone>("AndroidPhone");
containerBuilder.RegisterType<ApplePhone>().Keyed<IPhone>("ApplePhone");
IContainer container = containerBuilder.Build();
IPhone resolve = container.ResolveKeyed<IPhone>("AndroidPhone",new NamedParameter("Power",new Power( new Microphone( new Headphone() ) )));
resolve.Call();
