跳转至

程序集成Autofac的姿势⚓︎

在 .NET 6 中,官方对 ASP.NET Core 应用程序的项目结构进行了调整和简化,生成的项目默认删除了传统的 Startup.cs 文件。对于某些项目(如 ASP.NET Core 3.x,Blazor Server等)较曾经集成第三方服务的方式发生了一些变化。

本文就 .NET 6 及更高版本的项目(没有Startup.cs文件)提供集成 Autofac 库的示例程序。本文包含示例代码。

ASP.NET Core 项目的早期版本中,Startup.cs 文件用于配置应用程序的启动过程、服务和中间件。然而,随着时间的推移,这个文件变得越来越臃肿,配置代码变得复杂且不易维护。

为了改进这个问题,.NET 6 引入了一个更现代化的方式来组织和配置应用程序。现在,主要的配置代码被移到了 Program.cs 文件中,这样可以更清晰地定义应用程序的启动逻辑。

通过将配置代码集中到 Program.cs 文件中,可以使应用程序的启动逻辑更加简洁和易于理解。此外,使用 .NET 6 的新特性,如 WebApplication.CreateBuilder 方法和 app.MapControllers 方法,可以更便捷地进行应用程序的配置和路由。虽然 .NET 6 删除了传统的 Startup.cs 文件,但你仍然可以在 Program.cs 文件中进行应用程序的配置和服务的注册,以满足你的需求。

另外,你仍然可以在新项目中手动更改使用Startup.cs

为什么使用Autofac?⚓︎

.NET 5 之后,Microsoft提供了内置的依赖注入容器,尽管官方声称推荐使用内置容器,但面对一些场景它仍然不能满足要求。下面一段内容来源与 Microsoft 依赖关系注入指南 - .NET | Microsoft Learn

内置的服务容器旨在满足框架和大多数消费者应用的需求。 我们建议使用内置容器,除非你需要的特定功能不受它支持,例如:

  • 属性注入
  • 基于名称的注入
  • 子容器
  • 自定义生存期管理
  • 对迟缓初始化的 Func<T> 支持
  • 基于约定的注册

以下第三方容器可用于 ASP.NET Core 应用:

而Autofac是一个开源的轻量级的依赖注入容器,也是.net下比较流行的实现依赖注入的工具之一。

关于Autofac的一些链接:

集成⚓︎

在官方文档中已经提供了一些程序集的集成指南,你可以在这里浏览它们 Application Integration — Autofac 7.0.0 documentation .

1. 下载 Nuget 包⚓︎

如果你使用的 Visual Studio,你可以使用Nuget包管理器进行下载,这是最简单的方式。请下载安装以下两个包

Autofac Packages

Autofac Packages

2. 在Program.cs中更换默认容器⚓︎

public class Program
{
     public static void Main(string[] args)
     {
        //  var builder = WebApplication.CreateBuilder(args);

        /* Configure Autofac and register services. */
        // 更换容器为autofac
        builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

        // 注册服务
        builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
        {
            // 注册一个泛型类
            containerBuilder.RegisterGeneric(typeof(Repository<>))
                            .AsSelf()
                            .InstancePerLifetimeScope();

            // 程序集扫描注册:对于程序集中以Service结尾的服务类都会被注册进容器
            containerBuilder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                            .Where(t => t.Name.EndsWith("Service"))
                            .AsImplementedInterfaces()
                            .InstancePerLifetimeScope();
        });
     }
}

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()) 是使用 Autofac 作为依赖注入容器的一种配置方式。它是在 .NET Generic Host 中使用 Autofac 的方法之一。在这个配置中,builderWebApplicationBuilder 类型的实例,而 Host 属性是用于访问底层的 IHostBuilder 对象的。

UseServiceProviderFactory() 方法用于指定使用特定的依赖注入容器工厂。在这里,new AutofacServiceProviderFactory() 创建了一个 Autofac 的服务提供程序工厂。这将告诉主机使用 Autofac 作为依赖注入容器。

上述仅提供了两个注册服务组件的示例,更多的使用方式请参考官方文档。