领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

在 ASP.NET Core 中集成 Autofac 依赖注入容器:实现灵活的依赖管理

nixiaole 2025-03-28 19:36:53 知识剖析 17 ℃

大家好,我是深山踏红叶,今天我们来聊一聊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();
});

在调用服务时,拦截器会自动在服务方法调用之前或之后执行你定义的逻辑

  • 如果文章对您有帮助,请给我一个赞,谢谢
    点个小心是对我对大的支持!感谢

Tags:

最近发表
标签列表