自己实现一个IOC(控制翻转,DI依赖注入)容器
1.新建一个控制台应用程序 TestIOC
2.新增一个 IocFactory类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; using System.Reflection; namespace TestIOC { public class IocFactory { private string _path; private Dictionary<string, object> dict = new Dictionary<string, object>(); public IocFactory(string path) { this._path=path; } public object GetObject(string id) { XElement xe = XElement.Load(_path); var v = from c in xe.Elements("object") select c; dict = v.ToDictionary(k => k.Attribute("id").Value, s => { string type = s.Attribute("type").Value; Type ty = Type.GetType(type); return Activator.CreateInstance(ty); } ); return null; } } }
3.新增一个 PersonDao类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestIOC { public class PersonDao { public PersonDao() { Console.WriteLine(" this is PersonDao"); } public PersonDao(string name) { Console.WriteLine(" this is PersonDao:"+name); } } }
4.首先 新建一个object.xml
1 2 3 4 5 6 7 | <? xml version="1.0" encoding="utf-8" ?> < objects > < object id="PersonDao" type="TestIOC.PersonDao, TestIOC" /> </ objects > |
5.新控制台进行依赖注入
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace TestIOC { class Program { static void Main(string[] args) { string path = @"F:\Q\mytest\spring\TestIOC\TestIOC\object.xml"; IocFactory ioc = new IocFactory(path); PersonDao pd = ioc.GetObject("PersonDao") as PersonDao; Console.WriteLine("直接映射"); Activator.CreateInstance(Type.GetType("TestIOC.PersonDao")); Console.ReadLine(); } } }
6.显示效果
this is PersonDao
直接映射
this is PersonDao
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通