IOC、DI<3> IServiceConllection 自定义IOC含属性注入、多实现注入,方法注入,ioc三种注入方式

IOC、DI<3> IServiceConllection 自定义IOC含属性注入、多实现注入,方法注入
using System;
using System.Collections.Generic;
using System.Lin

使用系统;

使用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

(0)
CSDN's avatarCSDN
上一篇 2024年7月5日 上午10:24
下一篇 2024年7月5日 上午10:24

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注