IOC容器指控制反转(Inversion of Control,简称IoC),其是一种设计模式,它可以实现组件之间的松耦合,提高代码的可维护性和可测试性。IoC容器则是实现IoC模式的一种工具,它可以管理应用程序中的对象及其依赖关系,自动完成对象的创建、初始化、注入等操作,从而简化开发流程,提高开发效率。
1. 常用的IOC容器
1.1 Unity
Unity是一个开源的IoC容器,由微软推出,支持构造函数注入、属性注入和方法注入等方式,可以自动解决对象的依赖关系,支持AOP功能和生命周期管理等特性。
优势:Unity的配置方式比较灵活,支持通过代码、XML或者配置文件进行配置;拥有完善的文档以及社区支持
劣势:性能较差,特别是注入量较大时,运行相对较慢;拓展点较少
1.2. Autofac
Autofac是一个轻量级的IoC容器,支持构造函数注入、属性注入和方法注入等方式,可以自动解决对象的依赖关系,支持AOP功能和生命周期管理等特性,具有灵活、易于扩展的特点。
优势:Autofac的配置方式也比较灵活,支持通过代码、XML或者配置文件进行配置;性能较好,特别是注入大量对象时,具有更高效;支持扩展各种服务、注册器、模块等;
劣势:社区支持相对广泛,但文档较少
1.3. Ninject
Ninject是一个轻量级的IoC容器,支持构造函数注入和属性注入等方式,可以自动解决对象的依赖关系,支持AOP功能和生命周期管理等特性,具有简单、易用的特点。
优势:Ninject的配置方式则比较简单,只需要使用一个简单的绑定语法即可;性能较好,特别是注入大量对象时,具有更高效;语法简单。
劣势:拓展点较少;社区支持和文档资料较少。
1.4. Castle Windsor
Castle Windsor是一个强大的IoC容器,支持构造函数注入、属性注入和方法注入等方式,可以自动解决对象的依赖关系,支持AOP功能和生命周期管理等特性,具有灵活、可扩展的特点。
1.5. Simple Injector
Simple Injector是一个高性能的IoC容器,支持构造函数注入和属性注入等方式,可以自动解决对象的依赖关系,支持AOP功能和生命周期管理等特性,具有简单、易用的特点
2. 容器使用示例
2.1 Unity
1. 创建一个IService服务接口,并创建一个服务实现了Service
public interface IService { void DoSomething(); } public class Service : IService { public void DoSomething() { Console.WriteLine("Service is doing something."); } }
2. 创建一个控制器类,且依赖于IService
public class Controller { private readonly IService _service; public Controller(IService service) { _service = service; } public void DoWork() { _service.DoSomething(); } }
3.使用 Unity 容器进行依赖注入,将 IService 实例注入到 Controller 中
using System; using Unity; class Program { static void Main(string[] args) { var container = new UnityContainer(); // 注册服务接口和实现类 container.RegisterType<IService, Service>(); // 解析控制器实例 var controller = container.Resolve<Controller>(); // 使用控制器 controller.DoWork(); Console.ReadLine(); } }
2.2 AutoFac
1. 安装AutoFac类库,在NuGet搜索下载安装即可

2. 创建一个IService服务接口,并创建一个服务实现了Service
public interface IMyService { void DoSomething(); } public class MyServiceImpl : IMyService { public void DoSomething() { Console.WriteLine("Doing something..."); } }
3. 创建Autofac容器,并将IMyService接口和MyServiceImpl实现类进行注册
class Program { static void Main(string[] args) { var builder = new ContainerBuilder(); builder.RegisterType<MyServiceImpl>().As<IMyService>(); var container = builder.Build(); using (var scope = container.BeginLifetimeScope()) { var service = scope.Resolve<IMyService>(); service.DoSomething(); } } }
2.3 Ninject
1. 安装Ninject类库,在NuGet搜索下载安装即可

2. 创建一个IService服务接口,并创建一个服务实现了Service
public interface IMyService { void DoSomething(); } public class MyServiceImpl : IMyService { public void DoSomething() { Console.WriteLine("Doing something!"); } }
3. 创建一个Ninject内核并注册我们的服务
using Ninject; class Program { static void Main(string[] args) { // create a new Ninject kernel var kernel = new StandardKernel(); // register our service kernel.Bind<IMyService>().To<MyServiceImpl>(); // get an instance of our service var service = kernel.Get<IMyService>(); // use our service service.DoSomething(); Console.ReadLine(); } }
浙公网安备 33010602011771号