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())
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/