自定义容器,利用依赖注入创建对象

///容器:自动生成对象
/// 自动初始化需要的元素(依赖注入DI)

public interface IElevenContainer
{
void RegisterType<IT, T>();
IT Resolve<IT>();
}

//创建对象是使用无参构造器

public class ElevenContainer : IElevenContainer
{
private Dictionary<string, Type> typeContainer = new Dictionary<string, Type>();
public void RegisterType<IT, T>()
{
if (!typeContainer.ContainsKey(typeof(IT).FullName))
typeContainer.Add(typeof(IT).FullName, typeof(T));
}

public IT Resolve<IT>()
{
string key = typeof(IT).FullName;
if (!typeContainer.ContainsKey(typeof(IT).FullName))
{
throw new Exception("没有为{key}的初始化");
}
Type type = typeContainer[key];
//CreateInstance默认调用无参构造器,想要创建的对象的构造器如果是无参的,可以调用该方法
return (IT)Activator.CreateInstance(type);

}

}

//创建对象使用有属性标记的构造器,构造器依赖抽象类,抽象类构造器是无参构造器

public class ElevenContainer : IElevenContainer
{
private Dictionary<string, Type> typeContainer = new Dictionary<string, Type>();
public void RegisterType<IT, T>()
{
if (!typeContainer.ContainsKey(typeof(IT).FullName))
typeContainer.Add(typeof(IT).FullName, typeof(T));
}

public IT Resolve<IT>()
{
string key = typeof(IT).FullName;
if (!typeContainer.ContainsKey(typeof(IT).FullName))
{
throw new Exception("没有为{key}的初始化");
}
Type type = typeContainer[key];
var ctorArray = type.GetConstructors();
ConstructorInfo ctor = null;
if (ctorArray.Count(c => c.IsDefined(typeof(InjectionConstractorAttribute), true)) > 0)
{
//获取有标记属性InjectionConstractorAttribute的构造函数
ctor = ctorArray.FirstOrDefault(c => c.IsDefined(typeof(InjectionConstractorAttribute), true));
}
else
{
//获取构造器参数最多的构造函数
ctor = ctorArray.OrderByDescending(c => c.GetParameters().Length).FirstOrDefault();
}

var paraList = ctor.GetParameters();
Object[] paramArray = new object[paraList.Length];
int i = 0;
foreach (var param in paraList)
{
//方法一:构造函数依赖的参数对象的构造函数是无参的
//获取参数接口类型(代码是上层依赖下层的抽象)
Type interfaceType = param.ParameterType;
if (typeContainer.ContainsKey(interfaceType.FullName))
{
//获取参数
Type paramType = this.typeContainer[interfaceType.FullName];
//创建参数对象
Object objectParam = Activator.CreateInstance(paramType);
paramArray[i] = objectParam;
i++;
}
}
return (IT)Activator.CreateInstance(type, paramArray);

}

//创建对象使用有属性标记的构造器,构造器依赖抽象类,抽象类构造器是构造器依赖另外的抽象类,使用递归

public class ElevenContainer : IElevenContainer
{
private Dictionary<string, Type> typeContainer = new Dictionary<string, Type>();
public void RegisterType<IT, T>()
{
if (!typeContainer.ContainsKey(typeof(IT).FullName))
typeContainer.Add(typeof(IT).FullName, typeof(T));
}

public IT Resolve<IT>()
{
string key = typeof(IT).FullName;
if (!typeContainer.ContainsKey(typeof(IT).FullName))
{
throw new Exception("没有为{key}的初始化");
}
Type type = typeContainer[key];
return (IT)Resolve(type);

}

public object Resolve(Type type)
{
var ctorArray = type.GetConstructors();
ConstructorInfo ctor = null;
if (ctorArray.Count(c => c.IsDefined(typeof(InjectionConstractorAttribute), true)) > 0)
{
//获取有标记属性InjectionConstractorAttribute的构造函数
ctor = ctorArray.FirstOrDefault(c => c.IsDefined(typeof(InjectionConstractorAttribute), true));
}
else
{
//获取构造器参数最多的构造函数
ctor = ctorArray.OrderByDescending(c => c.GetParameters().Length).FirstOrDefault();
}

var paraList = ctor.GetParameters();
Object[] paramArray = new object[paraList.Length];
int i = 0;
foreach (var param in paraList)
{
Type interfaceType = param.ParameterType;
if (typeContainer.ContainsKey(interfaceType.FullName))
{
Type paramType = this.typeContainer[interfaceType.FullName];
var ParaObject = Resolve(paramType);
paramArray[i] = ParaObject;
i++;
}
}
return Activator.CreateInstance(type, paramArray);

}

public class Power: IPower
{
[InjectionConstractorAttribute]
public Power(IMicroPhone phone)
{
Console.WriteLine($"{phone.GetType().FullName}");
}
public Power()
{
Console.WriteLine($"{this.GetType().FullName}");
}
public Power(IMicroPhone phone, IPhone applePhone)
{
Console.WriteLine($"{phone.GetType().FullName} {applePhone.GetType().FullName}");
}

}

main函数:

IElevenContainer container = new ElevenContainer();
container.RegisterType<IMicroPhone, MicroPhone>();
container.RegisterType<IPower, Power>();
IPower power = container.Resolve<IPower>();

Console.ReadLine();

原文地址:https://www.cnblogs.com/fblogs/p/12169123.html

时间: 2024-11-09 06:04:16

自定义容器,利用依赖注入创建对象的相关文章

PHP中的服务容器与依赖注入的思想

依赖注入 当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合.这个时候解决方式是,A类应该去依赖B类的接口,把具体的类的实例化交给外部. 就拿我们业务中常用的通知模块来说. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php /**  * 定义了一个消息类  * Class Messag

Spring IOC - 控制反转(依赖注入) - 创建对象的方式

a.通过类的无参构造方法创建对象 在入门案例中就是这种方式.当用最普通的方式配饰一个<bean>时,默认就是采用类的 无参构造创建对象.在Spring容器初始化时,通过<bean>上配置的class属性反射的到字 节码对象,通过newInstance()创建对象. Class c = Class .forName("类的全路径名称") Object obj = c.newInstance() 这种方式下Spring创建对象,必须有无参的构造,否则无法通过反射创建

关于控制反转(IOC)容器 ,依赖注入(DI)模式必读文章收集

推荐一篇国外牛人的大作:Inversion of Control Containers and the Dependency Injection pattern http://martinfowler.com/articles/injection.html

php 依赖注入容器

原文: http://blog.csdn.net/realghost/article/details/35212285 https://my.oschina.net/cxz001/blog/533166 http://www.oschina.net/code/snippet_1171845_48046 http://blog.csdn.net/wzllai/article/details/24485245 看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这

理解 PHP 依赖注入 | Laravel IoC容器

Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,提高初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据库连接一直到通过容器加载服务这个高度解耦的设计展示了依赖注入的强大之处,值得我们借鉴和学习. -----------------------------------------------------------分割线下面是大牛的原文---------------------------------

理解PHP 依赖注入|Laravel IoC容器

看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,现在确实很懒变得! 首先,我们假设,我们要开发一个组件命名为SomeComponent.这个组件中现在将要注入一个数据库连接. 在这个例子中,数据库连接在component中被创建,这种方法是不切实际的,这样做的话,我们将不能改变数据库连接参数及数据库类型等一些参数. 01 <?php 02   0

控制容器的反转和依赖注入模式

本文依旧是一篇译文,写于作者在开发.net core 半年后的进阶学习时刻! 这篇文章很长,一口气看完得花二十分钟,大家要做好心理准备! 摘要:Java社群近来掀起了一阵轻量级容器的热潮,这些容器能够帮助开发者将来自不同项目的组件组装成为一个内聚的应用程序.在它们的背后有着同一个模式,这个模式决定了这些容器进行组件装配的方式.人们用一个大而化之的名字来称呼这个模式:”控制反转”(Inversion ofControl,IoC).在本文中,我将深入探索这个模式的工作原理,给它一个更能描述其特点的名

ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入

在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就是指使用者,下层就是指被使用者. 二.IoC控制反转 控制反转(IoC,全称Inversion of Control)是一种思想,所谓“控制反转”,就是反转获得依赖对象的过程. 三.依赖注入(DI) 依赖注入设计模式是一种在类及其依赖对象之间实现控制反转(IoC)思想的技术. 所谓依赖注入(DI,全

控制反转IOC与依赖注入DI - 理论篇

学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现,毕竟是之前的好同事,好朋友,我也就抽时间百度了很多资料 在查阅网上资料的过程中,我发现大多技术篇幅都是IOC的代码实现,并没有一篇介绍IOC理论的篇幅!这显然不是我想要的. 我知道要想搞明白IOC,就必须要弄明白什么是IOC(控制反转)?为什么叫IOC(控制反转)?为什么之后又可以称为DI(依赖注