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

相关推荐

  • 动态规划01背包问题优化

    上篇文章中,讲述了动态规划之0-1背包问题及其解决方法。它的时间复杂度和空间复杂度都为:O(n * C), 其中n为物品个数; C为背包容积。在时间复杂度方面已

    2024年8月29日
    0
  • 计算机终端安全设备

    计算机终端安全设备是指用于保护计算机终端设备安全的硬件设备或软件程序,可以帮助防止数据泄露、恶意软件攻击和其他安全威胁。以下是一些常见的计算机终端安全设备:防火

    2024年9月22日
    0
  • 10款常用绘图软件

    1)Visio适用人群:IT和商务专业人员缺点:付费。软件体积庞大,不支持MAC电脑和Linux使用左右拖拽不方便,必须点击滚动条才能左右滑动。2)Photos

    2024年9月21日
    0
  • 比LAN 共享更简单的远程复制文件方法

    我们在办公环境经常需要用共享功能,如把文件从一台传到另一台。我们当然可以用局域网共享的方式。但是共享比较复杂,尤其现在WIN10系统默认还不安装smb1.0。今

    2024年9月23日
    0

发表回复

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