IOC控制反转手写实现

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>();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值