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();
    }
}

 

posted on 2023-07-09 16:19  Mamba7  阅读(514)  评论(0)    收藏  举报