IOC控制反转:传统开发,上端依赖(调用/指定)下端对象,会有依赖
把对下端对象的依赖转移到第三方容器(工厂+配置文件+反射),传统应用中国,对象是我们手动控制new出来的,IOC中是容器控制对象的创建,帮我们new出来的,对象只是被动的接收依赖对象,因此称为反转
DI依赖注入:依赖注入就是能做到构造某个对象时,将依赖的对象自动初始化并注入。
三种注入方器:构造丽数注入--属性注入--方法注入(按时间顺序)
构造函数注入用的最多,默认找参数最多的构造函数,可以不用特性,可以去掉对容器的化
赖
IOC是目标是效果,需要DI依赖注入的手段
public class XuKunContainer:IXukunContainer
{
private Dictionary<string,Type> xukunContainerDictionary= new Dictionary<string, Type>():
public void RegisterType<TFrom, TTo>()
{
xukunContainerDictionary.Add(tvpeof(TFrom).FullName,tvpeof(TTo)):
}
public T Resolve<T>()
{
Type type=xukunContainerDictionary[typeof(T).FullName];
return (T)this.CreateObject(type);
}
private object CreateObject(Type type)
{
ConstructorInfo[] ctorArray=type.GetConstructors();
ConstructorInfo ctor = null:
if(ctorArray.Count(c=>c.IsDefined(typeof(ElevenInjectionConstructorAttribute),true))>
0)
{
ctor=ctorArray.FirstOrDefault(c =>c.IsDefined(typeof
(XukunInjectionConstructorAttribute),true)):
}
else
{
ctor=ctorArray.OrderByDescending(c =>c.GetParameters().Length).FirstOrDefault();
}
List<object> paraList = new List<object>();
foreach (var parameter in ctor.GetParameters())
{
Type paraType = parameter.ParameterType:
Type targetType=this.xukunContainerDictionary[paraType.FullName]; object para = this.CreateObject(targetType);
//递归:隐形的跳出条件,就是GetParameters结果为空,targetType拥有无参数构造函数 paraList.Add(para);
}
return Activator.CreateInstance(type,paraList.ToArray()):
}
}
public class Main(){
IXukunContainer container =newXukunContainer();
container.RegisterType<IPhone,AndroidPhone>():
IPhone phone = container.Resolve<IPhone>();
}