首页 > 其他分享 >手写IOC

手写IOC

时间:2023-05-24 22:35:32浏览次数:34  
标签:string RegisterType void key 手写 IOC public name

var container = new MyContainer();

container.RegisterType<ILanguage, Chinese>();
//使用别名注册
container.RegisterType<ILanguage, Englisth>("english");
var language = container.Resolve<ILanguage>();
var english = container.Resolve<ILanguage>("english");
Console.WriteLine(language.GetContent());
Console.WriteLine(english.GetContent());
Console.Read();

 

public interface ILanguage
{
public string GetContent();
}

public class Chinese:ILanguage
{
public string GetContent()
{
return "学习中文";
}
}
public class Englisth : ILanguage
{
public string GetContent()
{
return "Learning English";
}
}

public interface IMyContainer
{
/// <summary>
/// 注册单一类型
/// </summary>
/// <typeparam name="TType"></typeparam>
void RegisterType<TType>();
/// <summary>
/// 注册单一类型
/// </summary>
/// <typeparam name="TType"></typeparam>
/// <param name="name"></param>
void RegisterType<TType>(string name);

/// <summary>
/// 映射关系
/// </summary>
/// <typeparam name="TType"></typeparam>
/// <typeparam name="TImplementation"></typeparam>
void RegisterType<TType, TImplementation>();

void RegisterType<TType, TImplementation>(string name);
/// <summary>
/// 解析类型
/// </summary>
/// <typeparam name="TType"></typeparam>
/// <returns></returns>
TType Resolve<TType>();

/// <summary>
/// 解析类型
/// </summary>
/// <typeparam name="TType"></typeparam>
/// <param name="name"></param>
/// <returns></returns>
TType Resolve<TType>(string name);

}


public class MyContainer:IMyContainer
{

private static readonly Dictionary<string, object> ContainerDictionary = new Dictionary<string, object>();

public void RegisterType<TType>()
=> RegisterType<TType, TType>(null);

public void RegisterType<TType, TImplementation>()
=> RegisterType<TType, TImplementation>(null);


public void RegisterType<TType>(string name) =>
RegisterType<TType, TType>(null);

public void RegisterType<TType, TImplementation>(string name)
{
string key = typeof(TType).FullName;

if (!string.IsNullOrEmpty(name)) key = name;
if (ContainerDictionary.ContainsKey(key))
ContainerDictionary[key] = typeof(TImplementation); //如果存在采取覆盖形式
else
ContainerDictionary.Add(key, typeof(TImplementation));//将传进来的泛


}

public TType Resolve<TType>()
=>
Resolve<TType>(null);

public TType Resolve<TType>(string name)
{
//解析泛型Type获取key
var key = typeof(TType).FullName;
if (!string.IsNullOrWhiteSpace(name)) key = name;
// 根据key从容器中获取实现类
var type = (Type)ContainerDictionary[key];
//创建对象
return (TType)Activator.CreateInstance(type);
}
}

 

 

标签:string,RegisterType,void,key,手写,IOC,public,name
From: https://www.cnblogs.com/wugh8726254/p/17429737.html

相关文章

  • macbook苹果m1芯片训练机器学习、深度学习模型,resnet101在mnist手写数字识别上做加速
    apple的m1芯片比以往cpu芯片在机器学习加速上听说有15倍的提升,也就是可以使用applemac训练深度学习pytorch模型!!!惊呆了 安装applem1芯片版本的pytorch 然后使用chatGPT生成一个resnet101的训练代码,这里注意,如果网络特别轻的话是没有加速效果的,还没有cpu的计算来的快这里......
  • spring的IOC和AOP机制
    ioc(控制反转 inversionofcontrol)和aop(Aspect-OrientedProgramming)是spring的灵魂我的理解:控制反转就是说对原来对象的创建,也就是new一个对象,都是我们手动完成的,但是引入了ioc的思想之后,我们将对象的创建交给spring容器而不需要我们手动进行创建,我们要用的时候只需要将......
  • 深拷贝手写
    letarr=["张三","李四","王五",[1,2,3,4,5]];functiondeepCopy(obj1){letobj2=Array.isArray(obj1)?[]:{};for(letkeyinobj1){//hasOwnProperty:自身属性会返还true,否则会返还fal......
  • 成长笔记二、MySQL数据库--学生管理系统数据库手写SQL实现(实践篇)
    学生对象---->学生表(student)老师对象---->老师表(teacher)课程对象---->课程表(course)成绩对象---->成绩表(score)班级对象---->班级表(前缀_class,因为user或class等英文单词是程序中的关键字.尽量不直接用)等.....数据库设计设计参考上篇博客https://ww......
  • SpringIOC个人笔记
    上一章讲解了SpringBoot中的AutoConfiguration自动装配,而这一章就来讲讲自动装配时会用到的Spring三大特性之一的IOC控制反转。​ 使用过Spring的人都熟知,SpringIOC容器可以在对象生成或初始化时就直接将数据注入到对象中,如果对象A的属性是另一个对象B,还可以将这个对象B的引......
  • 从DIP到IOC再到DI
    1.概念IoC即控制反转,DI即依赖注入简单来说,IoC是一种思想,而DI是这种思想的具体实现方式2.深入了解要了解控制反转(InversionofControl),有必要先了解软件设计的一个重要思想:依赖倒置原则(DependencyInversionPrinciple)。2.1什么是依赖倒置原则假设我们设计一辆汽车:先......
  • ASP.NET Core(二):IOC、DI,即依赖注入和控制反转
    此文只是从中摘录整理下自己感兴趣的部分,以便备忘和方便查找回顾,详见:Artech-博客园(cnblogs.com)《ASP.NETCore6框架揭秘》整个ASP.NETCore框架建立在一个底层的依赖注入框架之上,它使用依赖注入容器提供所需的服务对象。服务服务通常由组件提供,组件可以理解成......
  • js 手写深比较
     functionisObject(obj){returntypeofobj==='object'&&obj!==null}functionisEqual(obj1,obj2){if(!isObject(obj1)||!isObject(obj2)){returnobj1===obj2;}if(obj1===obj2){returntrue;}leto......
  • 造轮计划 IOC
    IOC实现IOC的理念和实现理解IOC控制反转(InversionofControl,IoC)是一种设计模式,它将对象的创建和对象之间的依赖关系的管理从应用程序代码中转移到外部容器或框架中。这种模式的目的是减少应用程序代码的耦合度,使代码更加灵活和可维护。实现IOC实现IOC的方式有很多种,其中......
  • spring5中IOC容器(底层原理1-3)
    什么是IOC1.控制反转:把对象创建和对象之间的调用过程,交给spring进行管理2.使用IOC目的:为了耦合度降低IOC底层原理xml解析,工厂模式,反射 画图讲解IOC底层原理  IOC过程:  IOC接口1.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂2.Spring提供IOC容......