0
点赞
收藏
分享

微信扫一扫

Autofac替换.net Core原有的IOC容器

you的日常 2023-02-01 阅读 137


Autofac替换.net Core原有的IOC容器_以net Core3.1为例

  • ​​1、IOC、DI是什么​​
  • ​​2、Autofac是什么​​
  • ​​3、容器是什么​​
  • ​​4、.NET Core DI​​
  • ​​5、如何替换 Autofac 的 Ioc 容器​​
  • ​​1、安装NuGet包​​
  • ​​2、在 Program 文件中添加Autofac服务工厂​​
  • ​​3、在 Startup 文件中 自定义容器服务注册​​
  • ​​4、建立测试项​​
  • ​​Autofac 中文文档​​

1、IOC、DI是什么

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

2、Autofac是什么

  • Autofac 是一种IOC容器

3、容器是什么

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

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

4、.NET Core DI

  • 在.NET Core中DI的核心分为两个组件:​​IServiceCollection​​​ 和 ​​IServiceProvider​
  • 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())​

Autofac替换.net Core原有的IOC容器_c#

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

Autofac替换.net Core原有的IOC容器_autofac_02

4、建立测试项

Autofac替换.net Core原有的IOC容器_c#_03


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 页面正常出来,也就可以了

Autofac替换.net Core原有的IOC容器_ioc_04


Demo比较小所以就没有下面这种代码,我们的项目比较大的时候就可以使用啦,这种方式会方便很多

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

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

Autofac 中文文档

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


举报

相关推荐

0 条评论