跳至页脚内容
.NET 帮助

Microsoft.Extensions.DependencyInjection .NET 9(在 PDF 中的应用)

Microsoft.Extensions.DependencyInjection 是由 Microsoft .NET 提供的一个强大的库,用于促进依赖注入 (DI),这是一种软件设计模式,促进松耦合并增强应用程序的可测试性。 DI 通常使用内置的 .NET Core DI 容器或类似 Autofac 和 Unity 的库来实现。 DI 涉及将依赖项(类所需要的对象)注入到一个类中,而不是让类自己创建其依赖项。 这通常通过构造函数、方法或属性注入来完成。

Microsoft.Extensions.DependencyInjection .NET 6(使用 PDF):图 1 - Microsoft.Extensions.DependencyInjectionName 文档

依赖注入容器

  1. 服务注册:依赖项在 DI 容器中注册,通常位于应用程序的组合根。 这些注册指定了容器应如何创建和管理依赖项。

  2. 依赖解析:当组件请求依赖项时,DI 容器通过创建使用扩展方法的注册类型的实例来解析依赖项。

依赖注入的类型

  • 构造函数注入: 注册的服务通过构造函数提供给类,这是最常见和推荐的 DI 形式。
  • 方法注入:服务被解析并作为参数传递给方法。
  • 属性注入:单例服务或具有作用域生命周期的服务可以分配给类属性。 然而,这种方法不太常见,并且通常被认为不如构造函数注入,因为它可能引入隐藏的依赖项。

理解依赖注入(DI)中的生命周期:作用域、瞬态和单例

  1. 作用域: 作用域依赖项每个请求或生命周期范围创建一次,这意味着容器在单个请求或操作中提供相同的实例。 这种一致性在 Web 应用程序中特别有用,因为作用域依赖项有助于在整个 Web 请求中保持稳定的依赖项。
  2. 瞬态: 瞬态依赖项每次从容器请求时都会实例化。 这意味着每次需要瞬态依赖项时,都会生成一个新实例。 通常,瞬态依赖项用于轻量级、无状态的服务或组件。
  3. 单例: 单例依赖项只实例化一次,并在应用程序的整个生命周期中共享。这确保了在应用程序的整个期间,为所有请求使用同一个单例依赖项实例。 单例依赖项通常用于状态服务或需要在整个应用程序中普遍访问的组件。

安装 Microsoft.Extensions.DependencyInjection 包

要在 .NET Core 项目中开始使用依赖注入,首先需要安装 Microsoft.Extensions.DependencyInjection 包。 这可以通过 Visual Studio 中的 NuGet 包管理器控制台使用以下命令完成:

Install-Package Microsoft.Extensions.DependencyInjection

截图

Microsoft.Extensions.DependencyInjection .NET 6(使用 PDF):图 2 - 输入命令到终端以安装包

示例:基本依赖注入

在这个示例中,让我们创建一个示例应用程序(控制台应用程序),其中我们将利用服务提供者来解析服务并将其注入到我们的程序中。

using Microsoft.Extensions.DependencyInjection;
using System;

// Define a service interface
public interface IMessageService
{
    void SendMessage(string message);
}

// Implement the service interface
public class ConsoleMessageService : IMessageService
{
    public void SendMessage(string message)
    {
        Console.WriteLine(message); // Output the message to the console
    }
}
using Microsoft.Extensions.DependencyInjection;
using System;

// Define a service interface
public interface IMessageService
{
    void SendMessage(string message);
}

// Implement the service interface
public class ConsoleMessageService : IMessageService
{
    public void SendMessage(string message)
    {
        Console.WriteLine(message); // Output the message to the console
    }
}
Imports Microsoft.Extensions.DependencyInjection
Imports System

' Define a service interface
Public Interface IMessageService
	Sub SendMessage(ByVal message As String)
End Interface

' Implement the service interface
Public Class ConsoleMessageService
	Implements IMessageService

	Public Sub SendMessage(ByVal message As String) Implements IMessageService.SendMessage
		Console.WriteLine(message) ' Output the message to the console
	End Sub
End Class
$vbLabelText   $csharpLabel

代码片段创建了一个用于发送消息的接口 IMessageService,就像是一份关于如何发送消息的约定。 ConsoleMessageService 类通过使用 Console.WriteLine 发送消息来实现此接口。 这种分离允许独立于消息发送方式更改发送消息的概念,从而使系统灵活且易于管理。

class Program
{
    static void Main(string[] args)
    {
        // Create a service provider
        var serviceProvider = new ServiceCollection()
            // Register the service implementation
            .AddTransient<IMessageService, ConsoleMessageService>()
            .BuildServiceProvider();

        // Resolve the service
        var messageService = serviceProvider.GetRequiredService<IMessageService>();

        // Use the service to send a message
        messageService.SendMessage("Hello, From Dependency Injection!");
    }
}
class Program
{
    static void Main(string[] args)
    {
        // Create a service provider
        var serviceProvider = new ServiceCollection()
            // Register the service implementation
            .AddTransient<IMessageService, ConsoleMessageService>()
            .BuildServiceProvider();

        // Resolve the service
        var messageService = serviceProvider.GetRequiredService<IMessageService>();

        // Use the service to send a message
        messageService.SendMessage("Hello, From Dependency Injection!");
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Create a service provider
		Dim serviceProvider = (New ServiceCollection()).AddTransient(Of IMessageService, ConsoleMessageService)().BuildServiceProvider()

		' Resolve the service
		Dim messageService = serviceProvider.GetRequiredService(Of IMessageService)()

		' Use the service to send a message
		messageService.SendMessage("Hello, From Dependency Injection!")
	End Sub
End Class
$vbLabelText   $csharpLabel

这段代码设置了一个 serviceProvider 来管理服务。 它注册 ConsoleMessageService 作为 IMessageService 的实现,使其可以在需要时进行注入。 Main 方法然后从 serviceProvider 检索一个 IMessageService 的实例,并使用它向控制台发送消息。

输出: 程序打印字符串消息“Hello, From Dependency Injection!”

Microsoft.Extensions.DependencyInjection .NET 6(使用 PDF):图 3 - 上述代码的控制台输出

探索 IronPDF 用于 PDF 管理 是一个为使用 C# 编程语言的开发人员提供的工具,允许他们在其应用程序内部直接创建、读取和编辑 PDF 文档。

IronPDF is a powerful library for C# that simplifies the complex process of PDF generation, offering a wide range of features for PDF manipulation, including the ability to generate PDFs from HTML, operate adding text to PDFs and 使用图像编辑 PDFs、创建安全文档等等。

Microsoft.Extensions.DependencyInjection .NET 6(使用 PDF):图 4 - Microsoft.Extensions.DependencyInjection C# 示例(其工作原理与开发人员相同):图 2 - IronPDF

使用依赖注入与 IronPDF

要将 IronPDF 库集成到一个 leveraing 依赖注入功能和扩展方法与 Microsoft.Extensions.DependencyInjection 的 .NET Core 应用程序中,您可以按以下步骤操作:

  1. 创建一个接口来定义您的 PDF 生成服务。
  2. 实现接口。
  3. 利用扩展方法在依赖注入容器中注册服务。
  4. 根据需要将服务注入到您的应用程序中。

定义接口

创建一个接口来定义您的 PDF 生成服务。

public interface IPdfService
{
    void GeneratePdf(string baseUrl, string query, string filePath);
}
public interface IPdfService
{
    void GeneratePdf(string baseUrl, string query, string filePath);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

实现接口

使用 IronPDF 实现接口以创建 PDF 文件。

using IronPdf;
using System;
using System.Web;

// Implement the PDF generation interface
public class IronPdfService : IPdfService
{
    public void GeneratePdf(string baseUrl, string query, string filePath)
    {
        License.LicenseKey = "Your-License-Key"; // Set the IronPDF license key
        string encodedQuery = HttpUtility.UrlEncode(query); // Encode the query string
        string fullUrl = $"{baseUrl}?query={encodedQuery}"; // Construct the full URL
        var renderer = new ChromePdfRenderer(); // Create a PDF renderer
        var pdf = renderer.RenderUrlAsPdf(fullUrl); // Render the PDF from the URL
        pdf.SaveAs(filePath); // Save the PDF to the specified file path
        Console.WriteLine($"PDF successfully created from: {fullUrl}");
        Console.WriteLine($"Saved to: {filePath}");
    }
}
using IronPdf;
using System;
using System.Web;

// Implement the PDF generation interface
public class IronPdfService : IPdfService
{
    public void GeneratePdf(string baseUrl, string query, string filePath)
    {
        License.LicenseKey = "Your-License-Key"; // Set the IronPDF license key
        string encodedQuery = HttpUtility.UrlEncode(query); // Encode the query string
        string fullUrl = $"{baseUrl}?query={encodedQuery}"; // Construct the full URL
        var renderer = new ChromePdfRenderer(); // Create a PDF renderer
        var pdf = renderer.RenderUrlAsPdf(fullUrl); // Render the PDF from the URL
        pdf.SaveAs(filePath); // Save the PDF to the specified file path
        Console.WriteLine($"PDF successfully created from: {fullUrl}");
        Console.WriteLine($"Saved to: {filePath}");
    }
}
Imports IronPdf
Imports System
Imports System.Web

' Implement the PDF generation interface
Public Class IronPdfService
	Implements IPdfService

	Public Sub GeneratePdf(ByVal baseUrl As String, ByVal query As String, ByVal filePath As String)
		License.LicenseKey = "Your-License-Key" ' Set the IronPDF license key
		Dim encodedQuery As String = HttpUtility.UrlEncode(query) ' Encode the query string
		Dim fullUrl As String = $"{baseUrl}?query={encodedQuery}" ' Construct the full URL
		Dim renderer = New ChromePdfRenderer() ' Create a PDF renderer
		Dim pdf = renderer.RenderUrlAsPdf(fullUrl) ' Render the PDF from the URL
		pdf.SaveAs(filePath) ' Save the PDF to the specified file path
		Console.WriteLine($"PDF successfully created from: {fullUrl}")
		Console.WriteLine($"Saved to: {filePath}")
	End Sub
End Class
$vbLabelText   $csharpLabel

注册服务

在您的 Program.cs 类中配置依赖注入:

builder.Services.AddSingleton<IPdfService, IronPdfService>();
builder.Services.AddSingleton<IPdfService, IronPdfService>();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

此设置通过使用 IronPdfService 实现 IPdfService 接口来解析依赖项,建立用于 PDF 生成的单例服务类型。 然后在整个应用程序中引用它,确保生成 PDFs 的一致功能。

用法

IPdfService 注入到您的控制器或服务中并使用它:

public class MyController : Controller
{
    private readonly IPdfService _pdfService;

    public MyController(IPdfService pdfService)
    {
        _pdfService = pdfService;
    }

    public IActionResult GeneratePdf()
    {
        string baseUrl = "https://ironpdf.com/";
        string query = "Hello World from IronPDF !";
        string filePath = "Demo.pdf";

        // Use the injected PDF service to generate a PDF
        _pdfService.GeneratePdf(baseUrl, query, filePath);

        return View();
    }
}
public class MyController : Controller
{
    private readonly IPdfService _pdfService;

    public MyController(IPdfService pdfService)
    {
        _pdfService = pdfService;
    }

    public IActionResult GeneratePdf()
    {
        string baseUrl = "https://ironpdf.com/";
        string query = "Hello World from IronPDF !";
        string filePath = "Demo.pdf";

        // Use the injected PDF service to generate a PDF
        _pdfService.GeneratePdf(baseUrl, query, filePath);

        return View();
    }
}
Public Class MyController
	Inherits Controller

	Private ReadOnly _pdfService As IPdfService

	Public Sub New(ByVal pdfService As IPdfService)
		_pdfService = pdfService
	End Sub

	Public Function GeneratePdf() As IActionResult
		Dim baseUrl As String = "https://ironpdf.com/"
		Dim query As String = "Hello World from IronPDF !"
		Dim filePath As String = "Demo.pdf"

		' Use the injected PDF service to generate a PDF
		_pdfService.GeneratePdf(baseUrl, query, filePath)

		Return View()
	End Function
End Class
$vbLabelText   $csharpLabel

此设置确保 IronPdfService 由 Microsoft Extensions Dependency Injection 容器创建和管理。 您可以通过为 IPdfService 接口提供一个替代实现无缝替换默认的 PDF 生成服务,而无需更改使用代码。

截图 of the PDF File

Microsoft.Extensions.DependencyInjection .NET 6(使用 PDF):图 5 - 在与 IronPDF 结合使用的 Microsoft Extensions 依赖注入容器的示例输出

结论

Microsoft.Extensions.DependencyInjection 是 .NET 6 中实现依赖注入的强大工具,促进松耦合并增强应用程序的可测试性。 通过集成 IronPDF,这个功能丰富的 C# 库,开发人员可以轻松生成全面的 PDF 文档,而需稍费努力。 IronPDF 的许可 可用。

常见问题解答

Microsoft.Extensions.DependencyInjection 在 .NET 6 中的作用是什么?

.NET 6 中的 Microsoft.Extensions.DependencyInjection 用于实现依赖注入,这是一种设计模式,通过使用 DI 容器管理服务生命周期和依赖关系,帮助创建松耦合的应用程序。

依赖注入如何提高应用程序的可测试性?

依赖注入通过允许将依赖项注入类中进行增强,使其更容易在测试期间替换掉实现而使用模拟对象。

在 .NET 应用程序中使用依赖注入的好处是什么?

在 .NET 应用程序中使用依赖注入的好处包括改进代码的可维护性、可扩展性,以及能够在运行时轻松管理和配置依赖项。

如何在 .NET Core 应用程序中实现依赖注入?

在 .NET Core 应用程序中,依赖注入是在应用程序启动期间通过配置 DI 容器中的服务并根据需要将其注入到构造函数或方法中来实现的。

如何在 .NET Core 应用程序中将 HTML 转换为 PDF?

您可以在 .NET Core 应用程序中使用 IronPDF 的方法,例如 RenderHtmlAsPdf 处理 HTML 字符串或 RenderHtmlFileAsPdf 处理 HTML 文件,将 HTML 转换为 PDF。

依赖注入中服务的不同生命周期是什么以及它们如何影响应用程序的行为?

依赖注入中的服务生命周期包括 Scoped,Transient 和 Singleton。Scoped 服务每个请求创建一次,Transient 服务每次请求时创建,Singleton 服务则创建一次并在整个应用程序中共享。

如何在 .NET Core 项目中使用依赖注入集成 C# PDF 库?

要在 .NET Core 项目中使用依赖注入集成 C# PDF 库(如 IronPDF),您需要为 PDF 服务创建一个接口,实施它,将服务注册到 DI 容器中,并根据需要注入到您的类中。

安装 Microsoft.Extensions.DependencyInjection 包的过程是什么?

可以通过在 Visual Studio 中使用 NuGet 包管理器控制台,运行命令 Install-Package Microsoft.Extensions.DependencyInjection 来安装 Microsoft.Extensions.DependencyInjection 包。

如何结合 IronPDF 使用依赖注入生成 PDF?

通过设置 PDF 服务接口、使用 IronPDF 搜索方法实现它,并在 DI 容器中注册该服务,可以将 IronPDF 与依赖注入结合使用。然后可以注入该服务并用来从 URL 或 HTML 内容生成 PDF。

是否可以在不更改消费代码的情况下替换依赖注入设置中的 C# PDF 库?

是的,您可以通过实现 PDF 服务接口的替代版本来在依赖注入设置中替换 C# PDF 库,从而无需更改消费代码即可更换库。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。