大家好,我是深山踏红叶,今天我们来聊一聊ASP.NET Core 中集成 Autofac 依赖注入容器,它能提供更灵活的依赖管理功能,同时保持 ASP.NET Core 的原生功能与 Autofac 的强大特性。下面让我们看一看是怎么操作的。
安装
首先, 老规矩,先安装依赖包
dotnet add package Autofac
dotnet add package Autofac.Extensions.DependencyInjection
o Autofac:核心库。 o Autofac.Extensions.DependencyInjection: 与 ASP.NET Core DI 容器集成的扩展包。
使用
基本使用
using Autofac;
using Autofac.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// 1. 配置默认服务
builder.Services.AddControllersWithViews();
// 2. 使用 Autofac 替换默认容器
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
// 3. 配置 Autofac 容器
builder.Host.ConfigureContainer(containerBuilder =>
{
// 在这里注册你的服务
containerBuilder.RegisterType().As();
});
var app = builder.Build();
// 4. 配置 HTTP 请求管道
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
控制器中通过构造函数注入服务即可
public classHomeController : Controller
{
privatereadonly IMyService _myService;
public HomeController(IMyService myService)
{
_myService = myService;
}
public IActionResult Index()
{
var data = _myService.GetData();
return View(data);
}
}
使用 Autofac 模块
支持通过模块(Modules)来管理依赖注入。可以将相关的服务注册逻辑封装在模块中,保持代码的组织性和可维护性。
创建一个继承自 Module 的类,在这个类中注册你的服务
public class MyAutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType().As().InstancePerLifetimeScope();
builder.RegisterType().As().SingleInstance();
}
}
在 Program.cs
中注册模块:
builder.Host.ConfigureContainer(containerBuilder =>
{
containerBuilder.RegisterModule(new MyAutofacModule());
});
使得依赖注册更加结构化,模块化可以使注册逻辑更清晰、可维护,可以在多个项目中重用模块。
生命周期管理
o 单例(Single Instance):整个应用程序生命周期中只创建一个实例,适合无状态服务。 o 每个请求(Per Request / Scoped):每次 HTTP 请求创建一个新的实例,通常用于每个请求范围的服务。 o 瞬态(Transient):每次请求都创建一个新的实例,适合无状态的服务。
using Autofac;
publicclassMyModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// 单例
builder.RegisterType().As().SingleInstance();
// 每个请求一个实例
builder.RegisterType().As().InstancePerLifetimeScope();
// 瞬态,每次请求一个实例
builder.RegisterType().As().InstancePerDependency();
}
}
配合Castle.Core 拦截器
创建一个拦截器: 拦截器实现了 IInterceptor 接口,并重写 Intercept 方法。可以在这个方法中添加你需要执行的逻辑。
using Autofac.Extras.DynamicProxy;
using Castle.DynamicProxy; // 必须引入Castle.Core包来支持动态代理
publicclassMyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// 在方法调用前的逻辑
Console.WriteLine($"Calling method {invocation.Method.Name}");
// 调用原方法
invocation.Proceed();
// 在方法调用后的逻辑
Console.WriteLine($"Method {invocation.Method.Name} completed");
}
}
在模块中注册拦截器
public class MyModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// 启用拦截
builder.RegisterType()
.As()
.EnableInterfaceInterceptors()
.InterceptedBy(typeof(MyInterceptor));
builder.RegisterType();
}
}
配置动态代理
builder.Host.ConfigureContainer(containerBuilder =>
{
// 启用接口拦截
containerBuilder.RegisterType().As()
.EnableInterfaceInterceptors()
.InterceptedBy(typeof(MyInterceptor));
containerBuilder.RegisterType();
});
在调用服务时,拦截器会自动在服务方法调用之前或之后执行你定义的逻辑
如果文章对您有帮助,请给我一个赞,谢谢 点个小心是对我对大的支持!感谢