跳過到頁腳內容
.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 (Working With 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 (Working With 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 (Working With PDF):圖 3 - 上述代碼的控制台輸出

IronPDF: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 使用圖像編輯 PDF、創建安全文件等。

Microsoft.Extensions.DependencyInjection .NET 6 (Working With PDF):圖 4 - Microsoft.Extensions.DependencyInjection C# 範例(開發者如何使用):圖 2 - IronPDF

使用 IronPDF 進行依賴注入

要將 IronPDF 庫整合到使用 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

此設置通過實現 IPdfService 介面與 IronPdfService,建立了一個 PDF 生成的單例服務類型來解析依賴。 然後在整個應用程序中引用,確保生成 PDF 的功能的一致性。

使用

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 (Working With PDF):圖 5 - 使用 Microsoft Extensions Dependency Injection 容器結合 IronPDF 的範例輸出

結論

Microsoft.Extensions.DependencyInjection 是 .NET 6 中一個功能強大的工具,用於實現依賴注入,它促進鬆散耦合並提高應用程序的可測試性。 通過整合功能豐富的 C# 庫 IronPDF,開發人員可以輕鬆生成全面的 PDF 文件,並且只需很小的努力。 IronPDF 的許可 可用。

常見問題解答

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

Microsoft.Extensions.DependencyInjection 在 .NET 6 中用於實現依賴注入(Dependency Injection),這是一種設計模式,透過 DI 容器管理服務的生命週期和依賴關係來幫助創建鬆耦合的應用程式。

依賴注入如何增強應用程式的可測試性?

依賴注入透過允許將依賴注入到一個類中來增強可測試性,這使得在測試期間更容易替換模擬對象而非真實實現。

在 .NET 應用程式中使用依賴注入的好處是什麼?

.NET 應用程式中使用依賴注入的好處包括改進代碼的可維護性、可擴展性以及能夠在運行時輕鬆管理和配置依賴。

如何在 .NET Core 應用程式中實施依賴注入?

在 .NET Core 應用程式中,依賴注入是通過在應用程式啟動期間在 DI 容器中配置服務,並根據需要將它們注入到構造函數或方法中來實施的。

如何在 .NET Core 應用程式中將 HTML 轉換為 PDF?

您可以在 .NET Core 應用程式中使用 IronPDF 方法來將 HTML 轉換為 PDF,例如用於 HTML 字串的 RenderHtmlAsPdf 或用於 HTML 文件的 RenderHtmlFileAsPdf

依賴注入中服務的不同生命週期是什麼,它們如何影響應用程式行為?

依賴注入中的服務生命週期包括 Scoped、Transient 和 Singleton。Scoped 服務每個請求創建一次,Transient 服務每次請求都創建,Singleton 服務僅創建一次並在整個應用中共享。

如何在 .NET Core 項目中使用依賴注入集成 C# PDF 庫?

要在 .NET Core 項目中使用依賴注入集成 C# PDF 庫(如 IronPDF),您需要為 PDF 服務創建一個接口,實施它,將該服務註冊到 DI 容器中,並根據需要將其注入到類中。

安裝 Microsoft.Extensions.DependencyInjection 套件的過程是什麼?

Microsoft.Extensions.DependencyInjection 套件可以使用 Visual Studio 中的 NuGet Package Manager Console 來安裝,命令是:Install-Package Microsoft.Extensions.DependencyInjection

如何使用 IronPDF 和依賴注入來生成 PDF?

可以使用 IronPDF 配合依賴注入來生成 PDF,方法是設置一個 PDF 服務接口,用 IronPDF 方法實施它,並將其註冊到 DI 容器。然後可以注入這個服務並使用它從 URL 或 HTML 內容生成 PDF。

可以在不更改消費代碼的情況下在 DI 設置中替換 C# PDF 庫嗎?

是的,您可以通過實施 PDF 服務接口的替代版本來在 DI 設置中替換 C# PDF 庫,這樣可以在不更改消費代碼的情況下切換庫。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。