IOC--DI--自定义容器

public class XXXContainer : IXXXContainer
{
//ContainerDicationary 保存抽象与细节的映射类型
private Dictionary<string, Type> XXXContainerDicationary = new Dictionary<string, Type>();
public void RegisterType<TFrom, TTo>() where TTo : TFrom
{
XXXContainerDicationary.Add(typeof(TFrom).FullName, typeof(TTo));
}

//实例化对象,无论多少层级
public T Resolve<T>()
{

string abstartName = typeof(T).FullName;
Type type = XXXContainerDicationary[abstartName];
return (T)this.ObjectInstance(type);
}


//递归方法
private object ObjectInstance(Type type)
{
ConstructorInfo ctor = null;
//如果有XXXInjectionConstructor,就找出标记的有XXXInjectionConstructor特性的构造函数
if (type.GetConstructors().Count(c => c.IsDefined(typeof(XXXInjectionConstructor), true)) > 0)
{
ctor = type.GetConstructors().Where(c => c.IsDefined(typeof(XXXInjectionConstructor), true)).OrderByDescending(c => c.GetParameters().Length).FirstOrDefault();
}
else
{
ctor = type.GetConstructors().OrderByDescending(c => c.GetParameters().Length).First();
}

List<object> parameterlist = new List<object>();
foreach (ParameterInfo parameter in ctor.GetParameters())
{
string parameterType = parameter.ParameterType.FullName;
Type targetType = XXXContainerDicationary[parameterType];
object oParameter = this.ObjectInstance(targetType); //隐形的跳出条件:找到最后后一个依赖的五参数构造函数后就不再去递归了;
parameterlist.Add(oParameter);
}

object oInstance = Activator.CreateInstance(type, parameterlist.ToArray());//调用的五参数构造函数;//如果有两级依赖
return oInstance;

}
}


---------------IOC  DEMO-----------------------------------------------------------------------------------------
IXXXContainer container = new XXXContainer();//创建一个容器
container.RegisterType<IPhone, ApplePhone>();//告诉容器---抽象和细节的关系
container.RegisterType<IHeadphone, Headphone>();
container.RegisterType<IMicrophone, Microphone>();
container.RegisterType<IPower, Power>();
container.RegisterType<IBaseBll, BaseBll>();
IPhone phone = container.Resolve<IPhone>();//获取对象的实例

 

---------delegate demo ------------------------------------------------------------------

委托的好处:
public void SayHi(string name, PeopleType peopleType)
{
Console.WriteLine("prepare SayHi..");
switch (peopleType)
{
case PeopleType.Chinese:
Console.WriteLine($"{name},晚上好~");
break;
case PeopleType.American:
Console.WriteLine($"{name},good evening~");
break;

case PeopleType.Malaysia:
Console.WriteLine($"{name},*^%*^%^&%^%~");
break;

default://遇到不认识的枚举,说明调用有问题,那就不要隐藏,直接异常
throw new Exception("wrong peopleType");
}
}

public void SayHiPerfact(string name, SayHiDelegate method)
{
Console.WriteLine("prepare SayHi..");
method.Invoke(name);
}

public delegate void SayHiDelegate(string name);


---------调用委托-----------
{
SayHiDelegate method = new SayHiDelegate(student.SayHiChinese);
student.SayHiPerfact("大猫", method);
}
{
SayHiDelegate method = new SayHiDelegate(student.SayHiAmerican);
student.SayHiPerfact("PHS", method);
}

 

public void SayHiChinese(string name)
{
Console.WriteLine($"{name},晚上好~");
}

posted @ 2022-10-19 22:06  大树2  阅读(16)  评论(0编辑  收藏  举报