使用系统;
使用System.Collections.Generic。
使用System.Linq。
使用系统反射。
使用系统.文本。
使用系统.线程.任务。
命名空间IOC.Common
{
公共类ZenServiceCollection : IZenServiceCollection
{
//记录IOC注册抽象和实现。
私有字典字符串,类型zenRelationship=新字典字符串,类型();
///概括
///IOC容器映射关系注册===》抽象与具体
////概括
///参数名称=\’serviceType\’具体类/参数
///参数名称=\’implementationType\’实现类/参数
公共无效AddTransient(类型服务类型,类型实现类型)
{
this.zenRelationship.Add(serviceType.FullName,implementationType);
}
///概括
///获取服务
////概括
///类型参数名称=\’T\’/类型参数
///返回值/返回值
公共T GetServiceT()
{
{
//只有存在无参构造函数,如果类没有构造函数,ctr会自动生成无参构造函数,但是如果定义了有参构造函数,则不会自动创建无参构造函数。
//类型t=zenRelationship[typeof(T).FullName];
//返回(T)Activator.CreateInstance(t);
}
{
继续迭代并支持参数化构造函数。仅支持一级参数化构造函数。
//类型t=zenRelationship[typeof(T).FullName];
确定使用哪个构造函数来构造当前对象(默认情况下,选择参数最多的构造函数)。
//ConstructorInfo[] ctors=t.GetConstructors();
//ConstructorInfo ctor=ctors.OrderByDescending(c=c.GetParameters().Length).FirstOrDefault();
//Listobject paralist=new Listobject();
//foreach (ctor.GetParameters() 的ParameterInfo 项)
//{
//类型tt=item.ParameterType;
//类型ttt=item.GetType();
//类型t1=zenRelationship[item.ParameterType.FullName];
//var target=Activator.CreateInstance(t1);
//paralist.Add(目标);
//}
//return (T)Activator.CreateInstance(t, paralist.ToArray());
}
{
持续迭代,支持参数化构造函数、无线层次结构
//类型t=zenRelationship[typeof(T).FullName];
//返回(T)this.GetService(t);
}
{
//使用属性来指定构造函数的创建。默认情况下,使用大多数参数
类型t=zenRelationship[typeof(T).FullName];
返回(T)this.GetService(t);
}
}
私有对象GetService(类型类型)
{
#region 构造函数注入
ConstructorInfo[] ctors=type.GetConstructors();
ConstructorInfo ctor=ctors.Where(c=c.IsDefined(typeof(SelectConstructAttribute),true)).FirstOrDefault();
if (ctor==null)
{
如果//ctor不存在,则说明该构造函数没有对应的属性标识。
ctor=ctors.OrderByDescending(c=c.GetParameters().Length).FirstOrDefault();
}
Listobject paralist=new Listobject();
foreach(ctor.GetParameters() 的ParameterInfo 项)
{
类型t1=zenRelationship[item.ParameterType.FullName];
var target=this.GetService(t1);
paralist.Add(目标);
}
#region方法注入
//构造对象
对象objInstance=Activator.CreateInstance(type, paralist.ToArray());
//获取对象的属性。 PropertyInjectionAttribute 仅检索具有该属性的属性。
foreach (MethodInfo 类型的项.GetMethods().Where(c=c.IsDefined(typeof(MethodInjectionAttribute), true)))
{
Listobject paraOfMethodlist=new Listobject();
foreach(item.GetParameters() 的ParameterInfo 段落)
{
类型t1=zenRelationship[para.ParameterType.FullName];
var target=this.GetService(t1);
paraOfMethodlist.Add(目标);
}
item.Invoke(objInstance, paraOfMethodlist.ToArray());
}
#结束区域
#结束区域
插入#region 属性
//获取对象的属性。仅检索包含属性PropertyInjectionAttribute 的属性。
foreach (type.GetProperties().Where(c=c.IsDefined(typeof(PropertyInjectionAttribute),true))) 中的PropertyInfo 项
{
类型t1=zenRelationship[item.PropertyType.FullName];
var target=this.GetService(t1);
item.SetValue(objInstance,目标);
}
#结束区域
返回objInstance。
}
}
}
下载源代码
#IOC, DIIServiceConllection 以上关于自定义IOC的信息包括属性注入、多实现注入和方法注入。相关内容源网络请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93089.html