C# 实现IOC容器的简单实例
using System; using System.Collections.Generic; using System.Linq; public interface ICar { void Drive(); } public class Car : ICar { public void Drive() { Console.WriteLine("Driving a car..."); } } public interface IDriver { void DriveCar(); } public class Driver : IDriver { private readonly ICar car; public Driver() { } public Driver(ICar car) { this.car = car; } public void DriveCar() { car.Drive(); } } public interface IContainer { void Register<TFrom, TTo>(); T Resolve<T>(); } public class Container : IContainer { private readonly IDictionary<Type, Type> mappings = new Dictionary<Type, Type>(); public void Register<TFrom, TTo>() { mappings[typeof(TFrom)] = typeof(TTo); } public T Resolve<T>() { var type = typeof(T); if (!mappings.ContainsKey(type)) { throw new InvalidOperationException($"No mapping found for type {type.FullName}"); } return (T)Create(mappings[type]); } private object Create(Type type) { var constructors = type.GetConstructors(); List<object> parameters = new List<object>(); if(constructors.Length > 0) { var constructor = constructors.OrderByDescending(o => o.GetParameters().Length).FirstOrDefault(); if (constructor != null) { foreach (var par in constructor.GetParameters()) { parameters.Add(Create(mappings[par.ParameterType])); } } } return Activator.CreateInstance(type, parameters.ToArray()); } } public class Program { public static void Main() { var container = new Container(); container.Register<ICar, Car>(); container.Register<IDriver, Driver>(); var driver = container.Resolve<IDriver>(); driver.DriveCar(); Console.ReadLine(); } }
这个示例中,我们定义了一个简单的ICar和IDriver接口,并且实现了Car和Driver类。Driver类需要一个ICar对象才能工作。我们使用容器来注入ICar到Driver中,从而避免了显式地创建依赖项。Container类实现了IContainer接口,提供了Register方法来注册依赖项类型和实现类型的映射,同时提供了Resolve方法来解析依赖项并创建实例。
在Main方法中,我们首先创建一个容器对象,并向容器注册ICar和IDriver类型的映射。然后,我们从容器中解析IDriver类型的实例,并调用DriveCar方法来启动程序。由于Driver类的构造函数需要ICar类型的依赖项,容器会自动创建Car类的实例,并注入到Driver类的构造函数中,使得程序正常运行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~