.net 6 web api中使用Autofac依赖注入框架实现批量自动扫描程序集注册服务

本文介绍了如何通过Autofac和Autofac.Extensions.DependencyInjectionNuGet包实现自动扫描和依赖注入。在程序集中查找名称以Service结尾的公共类,并将这些类注册为它们实现的接口。通过一个例子展示了在IService接口添加方法,Service实现该方法并在控制器中验证依赖注入的成功。
摘要由CSDN通过智能技术生成
前言:要实现自动扫描依赖注入,我们要先安装下面这两个nuget包
Autofac
Autofac.Extensions.DependencyInjection
  1. 新建两个文件夹IService用于存放接口,里面存放有IEnd和IOperation两个接口类,Service用于存放实现类,存放有End和Operation两个实现类,我们要做的是自动依赖注入服务,自动让IEnd和End对应
    在这里插入图片描述
  2. 在Program.cs文件写入以下代码
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
    //builder.RegisterModule<AutofacModule>();
    var assemblies = Assembly.GetExecutingAssembly();
    builder.RegisterAssemblyTypes(assemblies)//程序集内所有具象类 
    .Where(c => c.Name.EndsWith("Service"))
    .PublicOnly()//只要public访问权限的
    .Where(cc => cc.IsClass)//只要class型(主要为了排除值和interface类型) 
    .AsImplementedInterfaces();
});

在这里插入图片描述
我来解析代码意思,下面这段代码的意思是,选择具有名称以 “Service” 结尾的类,并且它们必须是 public 访问权限的类,并且必须是 Class 类型的。然后,将这些类注册为它们实现的所有接口。

.Where(c => c.Name.EndsWith("Service"))
.PublicOnly()
.Where(cc => cc.IsClass)
.AsImplementedInterfaces();

.AsImplementedInterfaces() 方法会将每个选定的类注册为它们实现的所有接口。
具体来说,在这段代码中,当我们选定一个类时,.AsImplementedInterfaces() 方法会检查这个类实现了哪些接口,并将其注册为这些接口。
例如,如果我们有一个名为 UserService 的类,它实现了 IUserService 接口,那么在调用 .AsImplementedInterfaces() 方法时,Autofac会将 UserService 类注册为 IUserService 接口的实现。

因此,Autofac会根据类所实现的接口来找到对应的接口,并将这些接口作为类的服务注册到容器中。

#前面两步已经完成了自动扫描程序集批量依赖注入,下面是验证
验证:
  1. 在IService接口随便写一个方法,在Service实现该方法
    在这里插入图片描述
    在这里插入图片描述
    在控制器用构造函数初始化,然后调用该方法
    在这里插入图片描述
    运行成功
    在这里插入图片描述
使用 Autofac 进行批量依赖注入时,可以使用 Autofac 的 `RegisterAssemblyTypes` 方法实现。 首先,需要在程序标记需要注入的类型,可以使用 `Autofac.Module` 类进行实现。例如: ```csharp using Autofac; public class MyModule : Autofac.Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType<MyService>().As<IMyService>(); builder.RegisterType<MyRepository>().As<IMyRepository>(); // 注册其他需要注入的类型 } } ``` 然后,在 `Global.asax.cs` 文件使用 `ContainerBuilder` 类创建容器,并把需要注入的模块注册进去。例如: ```csharp using Autofac; using Autofac.Integration.WebApi; using System.Reflection; using System.Web.Http; public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { var builder = new ContainerBuilder(); builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly()); var container = builder.Build(); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); } } ``` 这样,就可以实现批量依赖注入了。在需要使用注入的类型时,可以通过构造函数注入或属性注入的方式获取实例。例如: ```csharp public class MyController : ApiController { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } [HttpGet] public IHttpActionResult MyAction() { // 使用 MyService return Ok(); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值