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},晚上好~");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2012-10-19 ios NSDictionary 操作
2012-10-19 ios NSDate 操作