跳至页脚内容
.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
    }
}
$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!");
    }
}
$vbLabelText   $csharpLabel

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

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

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

IronPDF:C# PDF 库

IronPDF 是一个强大的 C# 库,简化了 PDF 生成的复杂过程,提供了用于 PDF 操作的广泛功能,包括生成 从 HTML 生成 PDF、操作添加 文本到 PDFs使用图像编辑 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);
}
$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}");
    }
}
$vbLabelText   $csharpLabel

注册服务

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

builder.Services.AddSingleton<IPdfService, IronPdfService>();
builder.Services.AddSingleton<IPdfService, IronPdfService>();
$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();
    }
}
$vbLabelText   $csharpLabel

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

PDF 文件的截图

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 库,从而无需更改消费代码即可更换库。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,是 C# PDF 技术的先锋工程师。作为 Iron Software 核心代码库的原始开发者,自公司成立以来,他就塑造了公司的产品架构,并与首席执行官 Cameron Rimington 一起将其转变成一家公司,拥有50多人,服务于 NASA、特斯拉和全球政府机构。

Jacob 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。

他的旗舰 IronPDF 和 Iron Suite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。