.NET 帮助

Autofac .NET 6(它是如何为开发人员工作的)

发布 2024年七月1日
分享:

在 .NET 开发领域,有效管理依赖关系对于构建可扩展、可维护和可测试的应用程序至关重要。依赖注入 (DI) 在实现这些目标的过程中,集装箱通过促进控制权的倒置发挥着关键作用 (IoC) 原理在众多可用的通用托管机制库中,Autofac 是功能丰富、可扩展的 .NET 框架。

在本文中,我们将踏上探索 Autofac .NET 6 的旅程,揭开其功能和优点的神秘面纱,并展示其实际使用示例。在本文的后半部分,我们将了解 Iron Software 的 PDF 生成库 IronPDF。我们还将介绍一个将 Autofac.NET 和 IronPDF 结合使用的案例。

了解 Autofac .NET

Autofac 是 .NET 的开源 IoC 容器,为 Web API 等应用程序中的依赖注入和组件注册提供全面支持。Autofac 由 Nicholas Blumhardt 开发,并由一个专门的社区负责维护,它为管理对象生命周期、解决依赖关系和组合应用程序组件提供了一个强大而灵活的解决方案。

Autofac 的功能

  1. 容器构建和组件注册:您可以通过在启动类中注册组件,使用 Autofac 构建容器。你可以使用 lambdas、类型或预建实例来注册组件。
    public class Startup
    {
        public void ConfigureContainer()
        {
            var builder = new ContainerBuilder(); // host sub property builder
            builder.RegisterInstance(new TaskRepository()).As<ITaskRepository>();
            builder.RegisterType<TaskController>();
            builder.Register(c => new LogManager(DateTime.Now)).As<ILogger>();
            // Scan an assembly for components
            builder.RegisterAssemblyTypes(myAssembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();
            var container = builder.Build();
        }
    }
    public class Startup
    {
        public void ConfigureContainer()
        {
            var builder = new ContainerBuilder(); // host sub property builder
            builder.RegisterInstance(new TaskRepository()).As<ITaskRepository>();
            builder.RegisterType<TaskController>();
            builder.Register(c => new LogManager(DateTime.Now)).As<ILogger>();
            // Scan an assembly for components
            builder.RegisterAssemblyTypes(myAssembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();
            var container = builder.Build();
        }
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. 表达依赖关系:Autofac 可以注入构造函数参数、处理属性注入和方法注入。
    public class TaskController
    {
        private ITaskRepository _repository;
        private ILogger _logger;

        public TaskController(ITaskRepository repository, ILogger logger)
        {
            this._repository = repository;
            this._logger = logger;
        }
    }
    public class TaskController
    {
        private ITaskRepository _repository;
        private ILogger _logger;

        public TaskController(ITaskRepository repository, ILogger logger)
        {
            this._repository = repository;
            this._logger = logger;
        }
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. 灵活的模块系统:Autofac 模块在 XML 配置和基于代码的注册之间取得了平衡。您可以在代码中指定复杂的注册,或使用 XML 更改部署时的行为。
    public class CarTransportModule : Module
    {
        public bool ObeySpeedLimit { get; set; }

        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<Car>().As<IVehicle>();
            if (ObeySpeedLimit)
                builder.RegisterType<SaneDriver>().As<IDriver>();
            else
                builder.RegisterType<CrazyDriver>().As<IDriver>();
        }
    }
    public class CarTransportModule : Module
    {
        public bool ObeySpeedLimit { get; set; }

        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<Car>().As<IVehicle>();
            if (ObeySpeedLimit)
                builder.RegisterType<SaneDriver>().As<IDriver>();
            else
                builder.RegisterType<CrazyDriver>().As<IDriver>();
        }
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. 简单扩展点:Autofac 提供激活事件,可自定义组件的激活或释放。
    var builder = new ContainerBuilder();
    builder.RegisterType<Listener>().As<IListener>().OnActivated(e => e.Instance.StartListening());
    builder.RegisterType<Processor>().OnActivating(e => e.Instance.Initialize());
    var container = builder.Build();
    var builder = new ContainerBuilder();
    builder.RegisterType<Listener>().As<IListener>().OnActivated(e => e.Instance.StartListening());
    builder.RegisterType<Processor>().OnActivating(e => e.Instance.Initialize());
    var container = builder.Build();
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Autofac.NET 的主要功能

  1. 灵活的组件注册:Autofac 允许开发人员使用多种注册技术注册组件,包括手动注册、程序集扫描和基于属性的注册。这种灵活性可实现对组件实例化和配置的细粒度控制。

  2. 生命周期管理:Autofac 支持各种对象生命周期范围,包括单例、每个依赖的实例、每个生命周期范围的实例以及每个请求的实例。这种对对象生命周期的细粒度控制可确保资源的有效利用,并防止在长期运行的应用程序中出现内存泄漏。

  3. 自动依赖解析:Autofac 可根据已注册的组件注册及其依赖关系自动解析依赖关系。这种自动布线简化了复杂对象图的配置,促进了组件之间的松散耦合。

  4. 模块组合:Autofac 允许开发人员使用模块来组织和封装组件注册。模块可作为相关注册送体验金的逻辑容器,使管理和维护包含多个组件的大型应用程序变得更加容易。

  5. 拦截和 AOP:Autofac 支持拦截和面向方面的编程 (AOP) 通过其拦截扩展。有了拦截功能,开发人员可以在不修改组件实现的情况下,将日志、缓存和安全等跨领域问题应用到组件中。

  6. ASP.NET Core和.NET Core集成:Autofac与.NET Core和ASP.NET Core无缝集成,为现代网络应用程序和微服务中的依赖注入提供一流的支持。它利用内置的服务提供商抽象,确保与 .NET 生态系统的兼容性和互操作性。

使用 Autofac.NET 的实际例子

让我们通过一些实际例子来说明 Autofac.NET 的用法:

public class Program
{
    public static void Main()
    {
        // Setting up Autofac container
        var builder = new ContainerBuilder();
        // Registering types manually
        builder.RegisterType<MyService>().As<IMyService>();
        // Registering types using assembly scanning
        builder.RegisterAssemblyTypes(typeof(MyAssembly).Assembly)
            .Where(t => t.Name.EndsWith("Repository"))
            .AsImplementedInterfaces();
        // Registering modules
        builder.RegisterModule(new MyModule());
        // Building the container
        var container = builder.Build();
        // Resolving dependencies
        using (var scope = container.BeginLifetimeScope())
        {
            var service = scope.Resolve<IMyService>();
            service.DoSomething();
        }
    }
}
public class Program
{
    public static void Main()
    {
        // Setting up Autofac container
        var builder = new ContainerBuilder();
        // Registering types manually
        builder.RegisterType<MyService>().As<IMyService>();
        // Registering types using assembly scanning
        builder.RegisterAssemblyTypes(typeof(MyAssembly).Assembly)
            .Where(t => t.Name.EndsWith("Repository"))
            .AsImplementedInterfaces();
        // Registering modules
        builder.RegisterModule(new MyModule());
        // Building the container
        var container = builder.Build();
        // Resolving dependencies
        using (var scope = container.BeginLifetimeScope())
        {
            var service = scope.Resolve<IMyService>();
            service.DoSomething();
        }
    }
}
Public Class Program
	Public Shared Sub Main()
		' Setting up Autofac container
		Dim builder = New ContainerBuilder()
		' Registering types manually
		builder.RegisterType(Of MyService)().As(Of IMyService)()
		' Registering types using assembly scanning
		builder.RegisterAssemblyTypes(GetType(MyAssembly).Assembly).Where(Function(t) t.Name.EndsWith("Repository")).AsImplementedInterfaces()
		' Registering modules
		builder.RegisterModule(New MyModule())
		' Building the container
		Dim container = builder.Build()
		' Resolving dependencies
		Using scope = container.BeginLifetimeScope()
			Dim service = scope.Resolve(Of IMyService)()
			service.DoSomething()
		End Using
	End Sub
End Class
VB   C#

在本节中,我们演示了 Autofac.NET 在依赖注入方面的实际应用。从手动注册到程序集扫描和基于模块的注册,我们展示了 Autofac 在管理依赖关系方面所提供的灵活性。利用这些技术,开发人员可以简化应用程序的依赖注入过程,提高可维护性和可扩展性。

使用 Autofac.NET 的优势

  1. 简单灵活:Autofac 为注册和解析组件提供了简单直观的应用程序接口,使依赖注入易于实施和维护。

  2. 可测试性和可维护性:通过促进松散耦合和依赖反转,Autofac 增强了.NET 应用程序的可测试性和可维护性,从而轻松实现单元测试和重构。

  3. 性能和可扩展性:Autofac 轻量级、高效的运行时性能使其适用于高性能应用程序和具有大型对象图的可扩展系统。

  4. 可扩展性和定制:Autofac 的可扩展架构允许开发人员通过自定义模块、注册源和中间件组件来扩展和定制 Autofac 的行为,从而满足不同的应用需求。

  5. 社区和支持:Autofac拥有活跃的开发人员社区和全面的文档,可为学习、故障排除和框架贡献提供出色的支持和资源。

Autofac 许可

Autofac 采用 MIT 许可,可免费用于开发和商业目的。

介绍 Iron Software 的 IronPDF

Autofac .NET 6(如何为开发人员工作):图 1 - IronPDF 网页

IronPDF 是一个强大的 C# PDF 库,旨在为 .NET 项目中的 PDF 管理提供全面的解决方案。无论您需要创建、编辑、导出、保护、加载或操作 PDF 文档,IronPDF 都能满足您的需求。以下是它的一些突出功能和应用程序:

主要功能

  • HTML 转换为 PDF:轻松将 HTML 内容转换为 PDF。从 HTML、MVC、ASPX 和图像生成 PDF。
  • PDF 管理:IronPDF 具有 50 多种功能,允许您签署、编辑和提取 PDF 内容,使数字签名和修改变得简单。

  • 跨平台支持:IronPDF与C#、F#和VB.NET兼容,可在各种.NET版本上运行,包括.NET Core、.NET Standard和.NET Framework。它还适用于 Java、Node.js 和 Python。

兼容性和环境

  • .NET版本:支持 C#、VB.NET 和 F#。
  • 项目类型:适用于网络 (Blazor 和 WebForms)桌面 (WPF 和 MAUI)和控制台应用程序。
  • 应用环境:兼容 Windows、Linux、Mac、Docker、Azure、AWS 等。
  • IDEs:与 Microsoft Visual Studio 和 JetBrains Rider 无缝集成。

  • 操作系统和处理器:可在 Windows、Mac 和 Linux 上运行 (x64,x86,ARM).

PDF 标准与编辑

  • 兼容性:支持各种 PDF 版本 (1.2 - 1.7)PDF/UA 和 PDF/A。
  • 自定义:为 PDF 文件设置属性、安全性和压缩。
  • 元数据和结构:编辑元数据、修订历史和文档结构。
  • 模板和设置:应用页面模板、页眉、页脚和页面:应用页面模板、页眉、页脚和页面设置。

性能优化

  • 效率:完全支持多线程和异步,可高效生成 PDF。
  • 优先:注重准确性、易用性和速度。

现在,让我们用这两个库来看一个实际例子。

使用 Autofac.NET 和 IronPDF 生成 PDF 文档

首先,让我们创建一个 Visual Studio 控制台应用程序

Autofac .NET 6(如何为开发人员工作):图 2 - 创建 Visual Studio 控制台应用程序

提供项目名称和地点。

Autofac .NET 6(如何为开发人员工作):图 3 - 配置项目详细信息

下一步,选择所需的 .NET 版本,然后单击 "创建"。

然后从 Visual Studio 包管理器的 NuGet 包中安装 IronPDF 库

Autofac .NET 6(如何为开发人员工作):图 4 - 安装必要的 IronPDF 软件包

从 Visual Studio 软件包管理器中的 NuGet 软件包安装 Autofac

Autofac .NET 6(如何为开发人员工作):图 5 - 安装必要的 Autofac 软件包

代码示例:Autofac 和 IronPDF

using Autofac;
using CacheManager.Core;
using IronPdf;
using System.Reflection;

namespace IronPdfDemos
{
    public class AutoFac
    {
        public static void Execute()
        {
            // Instantiate Cache and ChromePdfRenderer
            var renderer = new ChromePdfRenderer();
            var cache = CacheFactory.Build("ironPdfAutofac", settings =>
            {
                settings.WithDictionaryHandle();
            });

            // Prepare HTML content
            var content = "<h1>Demonstrate Autofac with IronPDF</h1>";
            content += "<p>This is an illustration of using Autofac for dependency injection and IronPDF for generating PDF documents.</p>";
            content += "<h2>Setting up Autofac container</h2>";

            // Setting up Autofac container
            var builder = new ContainerBuilder();
            content += "<p>var builder = new ContainerBuilder();</p>";

            content += "<h2>Registering types manually</h2>";
            // Registering types manually
            builder.RegisterType<MyService>().As<IMyService>();
            content += "<p>builder.RegisterType<MyService>().As<IMyService();</p>";

            content += "<h2>Registering types using assembly scanning</h2>";
            // Registering types using assembly scanning
            builder.RegisterAssemblyTypes(typeof(AutoFac).Assembly)
                .Where(t => t.Name.EndsWith("Repository"))
                .AsImplementedInterfaces();
            content += "<p>builder.RegisterAssemblyTypes(typeof(AutoFac).Assembly).Where(t => t.Name.EndsWith(\"Repository\")).AsImplementedInterfaces();</p>";

            content += "<h2>Registering modules</h2>";
            // Registering modules
            builder.RegisterModule(new MyModule());
            content += "<p>builder.RegisterModule(new MyModule());</p>";

            content += "<h2>Building the container</h2>";
            // Building the container
            var container = builder.Build();
            content += "<p>var container = builder.Build();</p>";

            content += "<h2>Resolving dependencies</h2>";
            // Resolving dependencies
            using (var scope = container.BeginLifetimeScope())
            {
                var service = scope.Resolve<IMyService>();
                service.DoSomething();
            }
            content += "<p>var service = scope.Resolve<IMyService();</p>";

            // Create a PDF from the HTML string using C#
            var pdf = renderer.RenderHtmlAsPdf(content);
            // Export to a file or Stream
            pdf.SaveAs("autofac.pdf");
            Console.WriteLine("We are done...");
            Console.ReadKey();
        }
    }

    internal interface IMyService
    {
        void DoSomething();
    }

    internal class MyModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            // Register module dependencies here
        }
    }

    internal class MyService : IMyService
    {
        public void DoSomething()
        {
            Console.WriteLine("DoSomething");
        }
    }
}
using Autofac;
using CacheManager.Core;
using IronPdf;
using System.Reflection;

namespace IronPdfDemos
{
    public class AutoFac
    {
        public static void Execute()
        {
            // Instantiate Cache and ChromePdfRenderer
            var renderer = new ChromePdfRenderer();
            var cache = CacheFactory.Build("ironPdfAutofac", settings =>
            {
                settings.WithDictionaryHandle();
            });

            // Prepare HTML content
            var content = "<h1>Demonstrate Autofac with IronPDF</h1>";
            content += "<p>This is an illustration of using Autofac for dependency injection and IronPDF for generating PDF documents.</p>";
            content += "<h2>Setting up Autofac container</h2>";

            // Setting up Autofac container
            var builder = new ContainerBuilder();
            content += "<p>var builder = new ContainerBuilder();</p>";

            content += "<h2>Registering types manually</h2>";
            // Registering types manually
            builder.RegisterType<MyService>().As<IMyService>();
            content += "<p>builder.RegisterType<MyService>().As<IMyService();</p>";

            content += "<h2>Registering types using assembly scanning</h2>";
            // Registering types using assembly scanning
            builder.RegisterAssemblyTypes(typeof(AutoFac).Assembly)
                .Where(t => t.Name.EndsWith("Repository"))
                .AsImplementedInterfaces();
            content += "<p>builder.RegisterAssemblyTypes(typeof(AutoFac).Assembly).Where(t => t.Name.EndsWith(\"Repository\")).AsImplementedInterfaces();</p>";

            content += "<h2>Registering modules</h2>";
            // Registering modules
            builder.RegisterModule(new MyModule());
            content += "<p>builder.RegisterModule(new MyModule());</p>";

            content += "<h2>Building the container</h2>";
            // Building the container
            var container = builder.Build();
            content += "<p>var container = builder.Build();</p>";

            content += "<h2>Resolving dependencies</h2>";
            // Resolving dependencies
            using (var scope = container.BeginLifetimeScope())
            {
                var service = scope.Resolve<IMyService>();
                service.DoSomething();
            }
            content += "<p>var service = scope.Resolve<IMyService();</p>";

            // Create a PDF from the HTML string using C#
            var pdf = renderer.RenderHtmlAsPdf(content);
            // Export to a file or Stream
            pdf.SaveAs("autofac.pdf");
            Console.WriteLine("We are done...");
            Console.ReadKey();
        }
    }

    internal interface IMyService
    {
        void DoSomething();
    }

    internal class MyModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            // Register module dependencies here
        }
    }

    internal class MyService : IMyService
    {
        public void DoSomething()
        {
            Console.WriteLine("DoSomething");
        }
    }
}
Imports Autofac
Imports CacheManager.Core
Imports IronPdf
Imports System.Reflection

Namespace IronPdfDemos
	Public Class AutoFac
		Public Shared Sub Execute()
			' Instantiate Cache and ChromePdfRenderer
			Dim renderer = New ChromePdfRenderer()
			Dim cache = CacheFactory.Build("ironPdfAutofac", Sub(settings)
				settings.WithDictionaryHandle()
			End Sub)

			' Prepare HTML content
			Dim content = "<h1>Demonstrate Autofac with IronPDF</h1>"
			content &= "<p>This is an illustration of using Autofac for dependency injection and IronPDF for generating PDF documents.</p>"
			content &= "<h2>Setting up Autofac container</h2>"

			' Setting up Autofac container
			Dim builder = New ContainerBuilder()
			content &= "<p>var builder = new ContainerBuilder();</p>"

			content &= "<h2>Registering types manually</h2>"
			' Registering types manually
			builder.RegisterType(Of MyService)().As(Of IMyService)()
			content &= "<p>builder.RegisterType<MyService>().As<IMyService();</p>"

			content &= "<h2>Registering types using assembly scanning</h2>"
			' Registering types using assembly scanning
			builder.RegisterAssemblyTypes(GetType(AutoFac).Assembly).Where(Function(t) t.Name.EndsWith("Repository")).AsImplementedInterfaces()
			content &= "<p>builder.RegisterAssemblyTypes(typeof(AutoFac).Assembly).Where(t => t.Name.EndsWith(""Repository"")).AsImplementedInterfaces();</p>"

			content &= "<h2>Registering modules</h2>"
			' Registering modules
			builder.RegisterModule(New MyModule())
			content &= "<p>builder.RegisterModule(new MyModule());</p>"

			content &= "<h2>Building the container</h2>"
			' Building the container
			Dim container = builder.Build()
			content &= "<p>var container = builder.Build();</p>"

			content &= "<h2>Resolving dependencies</h2>"
			' Resolving dependencies
			Using scope = container.BeginLifetimeScope()
				Dim service = scope.Resolve(Of IMyService)()
				service.DoSomething()
			End Using
			content &= "<p>var service = scope.Resolve<IMyService();</p>"

			' Create a PDF from the HTML string using C#
			Dim pdf = renderer.RenderHtmlAsPdf(content)
			' Export to a file or Stream
			pdf.SaveAs("autofac.pdf")
			Console.WriteLine("We are done...")
			Console.ReadKey()
		End Sub
	End Class

	Friend Interface IMyService
		Sub DoSomething()
	End Interface

	Friend Class MyModule
		Inherits Module

		Protected Overrides Sub Load(ByVal builder As ContainerBuilder)
			' Register module dependencies here
		End Sub
	End Class

	Friend Class MyService
		Implements IMyService

		Public Sub DoSomething() Implements IMyService.DoSomething
			Console.WriteLine("DoSomething")
		End Sub
	End Class
End Namespace
VB   C#

代码解释

让我们来分析一下您提供的代码片段:

  1. ChromePdfRenderer设置

    • 代码初始化用于渲染 PDF 的 ChromePdfRenderer 实例。
  2. HTML 内容准备

    • 内容 "变量是用于生成 PDF 的 HTML 字符串。

    • 它包括一个<h1>标签,标题为 "使用 IronPDF 演示 Autofac"。
  3. 设置 Autofac 容器

    • 代码会创建一个名为 builderContainerBuilder 实例。

    • 这是设置 Autofac 容器进行依赖注入的第一步。
  4. 手动注册类型

    • 它将 MyService 类型注册为 IMyService 接口的实现。

    • 这允许 Autofac 在需要时解决依赖关系。
  5. 使用程序集扫描注册类型

    • 它会扫描包含 AutoFac 类型的程序集。

    • 将名称以 "Repository "结尾的类型注册为相应接口的实现。
  6. 注册模块

    • 它会注册一个名为 "MyModule "的模块。

    • 模块允许对相关注册进行分组。
  7. 建造集装箱

    • 容器是通过使用 `builder.Build()方法。
  8. 解决依赖问题

    • 在生命周期范围内 (使用 (var scope = container.BeginLifetimeScope())`)的实例。

    • 在解析后的服务上调用 DoSomething 方法。
  9. PDF 生成

    • 使用 ChromePdfRenderer 根据内容创建 PDF。

    • 生成的 PDF 保存为 "autofac.pdf"。

输出

Autofac .NET 6(如何为开发人员工作):图 6 - 上一代码示例的 PDF 输出结果

IronPDF 许可证

IronPDF 需要许可证密钥。如下所示,将许可证密钥放入 appSettings.json 文件。

{
  "IronPdf.License.LicenseKey": "The Key Here"
}

结论

总之,Autofac.NET 作为 .NET 的依赖注入容器,功能强大且丰富,可帮助开发人员构建模块化、可维护和可扩展的应用程序。无论您是在开发桌面应用程序、网络服务还是云原生解决方案,Autofac 都能为您提供可靠的基础,帮助您管理依赖关系,促进 .NET 开发中的最佳实践。

IronPDF 是一个功能丰富的多功能库,用于生成、编辑和读取 PDF 文档。利用 Iron Software 的 IronPDF 库读取和生成 PDF 文档,开发人员可以获得开发现代应用程序的高级技能。

< 前一页
OpenTelemetry .NET(如何为开发者工作)
下一步 >
Papercut SMTP C# (开发者如何使用)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,746,704 查看许可证 >