1、IOC、DI是什么

  • IOC:调用者不再创建(不自己new)被调用者的实例,而是交给容器去创建(Autofac就充当这里的容器),这就是控制反转
  • DI:容器创建好的实例再注入调用者的过程,就是依赖注入(比如:属性注入、构造函数注入等)

2、Autofac是什么

  • Autofac 是一种IOC容器

3、容器是什么

  我们在使用***Controller的时候,我们自己通过代码创建了一个***Servce的实例。想象一下,一个系统中如果有1千个这样的地方,我们是不是要在11千个地方做这样的事情? 控制是反转了,依赖的创建也移交到了外部。现在的问题是依赖太多,我们需要一个地方统一管理系统中所有的依赖,容器诞生了

  • 容器负责两件事情:
    • 绑定服务与实例之间的关系
    • 获取实例,并对实例进行管理(创建与销毁)

4、.NET Core DI

  • 在.NET Core中DI的核心分为两个组件:IServiceCollectionIServiceProvider
    • IServiceCollection 负责注册
    • IServiceProvider 负责提供实例

通过默认的 ServiceCollection(在Microsoft.Extensions.DependencyInjection命名空间下)有三个方法:

var serviceCollection = new ServiceCollection()
  
  .AddTransient<ILoginService, EFLoginService>() // 瞬时
  
  .AddSingleton<ILoginService, EFLoginService>() // 单例
  
  .AddScoped<ILoginService, EFLoginService>(); // 作用域

5、如何替换 Autofac 的 Ioc 容器

1、安装NuGet包

Autofac.Extensions.DependencyInjection

2、在 Program 文件中添加Autofac服务工厂

.UseServiceProviderFactory(new AutofacServiceProviderFactory())
在这里插入图片描述

3、在 Startup 文件中 自定义容器服务注册

/// <summary>
/// 自定义容器服务注册
/// </summary>
/// <param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder)
{
    // 业务逻辑层 所在程序集命名空间
    Assembly service = Assembly.Load("WebAPI.Services");
    // 接口层 所在程序集命名空间
    Assembly repository = Assembly.Load("WebAPI.IService");
    // 自动注入
    builder.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces();
}

在这里插入图片描述

4、建立测试项

在这里插入图片描述
TestController.cs

using Microsoft.AspNetCore.Mvc;
using WebAPI.IService;

namespace WebAPI.Demo.Controllers
{
    /// <summary>
    /// 测试控制器
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        private readonly ITestService _testService;

        public TestController(ITestService testService)
        {
            _testService = testService;
        }

        /// <summary>
        /// 测试获取数据
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get()
        {
            return _testService.Get();
        }

        /// <summary>
        /// 测试获取名称
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        [HttpPost]
        public string GetName(string name)
        {
            return _testService.GetName(name);
        }
    }
}

ITestService.cs

namespace WebAPI.IService
{
    public interface ITestService
    {
        string Get();
        string GetName(string name);
    }
}

TestService.cs

using WebAPI.IService;

namespace WebAPI.Services
{
    public class TestService : ITestService
    {
        public string Get()
        {
            return "get test";
        }

        public string GetName(string name)
        {
            return $"name:{name}";
        }
    }
}

运行项目,swagger 页面正常出来,也就可以了
在这里插入图片描述
Demo比较小所以就没有下面这种代码,我们的项目比较大的时候就可以使用啦,这种方式会方便很多

builder.RegisterGeneric(typeof(LoggingBehavior<,>)).As(typeof(IPipelineBehavior<,>));
  
builder.RegisterGeneric(typeof(ValidatorBehavior<,>)).As(typeof(IPipelineBehavior<,>));

Autofac 中文文档

初学,各方面不全,有兴趣的可以查阅官方文档,细细研究下
https://autofaccn.readthedocs.io/zh/latest/

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐