Passer au contenu du pied de page
.NET AIDE

CQRS Pattern C# (Comment ça fonctionne pour les développeurs)

Introduction au CQRS

CQRS signifie Command Query Responsibility Segregation. C'est un modèle qui se concentre sur la séparation de la lecture des données de leur écriture. Cette distinction est cruciale pour plusieurs raisons. Tout d'abord, elle permet une optimisation plus flexible de chaque opération, améliorant ainsi les performances et la scalabilité de l'application. Lorsque vous séparez les commandes (écritures) et les requêtes (lectures), vous pouvez les optimiser indépendamment.

Par exemple, une application complexe peut nécessiter des opérations de lecture rapides mais peut tolérer des opérations d'écriture plus lentes. En appliquant CQRS, les développeurs peuvent utiliser différents modèles de données pour les lectures et les écritures, en séparant la couche d'accès aux données pour répondre aux besoins spécifiques de chaque opération. Dans cet article, nous explorerons les concepts du modèle CQRS et la bibliothèque *IronPDF pour les développeurs .NET.

Concepts et Composants de Base

Le cœur de CQRS réside dans la séparation des opérations de commande et de requête, chacune traitant différents aspects de l'interaction avec les données. Comprendre ces composants est crucial pour implémenter efficacement le modèle.

  • Commandes : Elles sont responsables de la mise à jour des données. Les commandes incarnent une logique métier complexe et peuvent modifier l'état des données dans le stockage de données en agissant sans retourner d'information. Les commandes prennent le rôle exclusif de gérer les tâches d'écriture de données, influençant directement l'état de l'application sans produire de sortie. Par exemple, l'ajout d'un nouvel utilisateur ou la mise à jour des informations d'un produit existant sont des actions effectuées par des commandes.

  • Requêtes : Les requêtes, gérées par un gestionnaire de requêtes, récupèrent des données ou des objets de transfert de données sans modifier l'état du système. Ce sont les questions que vous posez sur vos données. Par exemple, récupérer le profil d'un utilisateur ou lister tous les produits disponibles dans un inventaire sont des requêtes. Les requêtes retournent des données mais s'assurent de ne pas modifier les données ou leur état.

L'un des outils populaires pour implémenter CQRS dans les applications .NET est MediatR, une bibliothèque de modèles médiateurs. Il aide à réduire l'interdépendance entre les composants d'une application, les faisant communiquer indirectement. MediatR facilite la gestion des commandes et des requêtes en médiant entre la commande/requête et son gestionnaire.

Mise en œuvre Pratique avec ASP.NET Core

Implémenter le modèle CQRS dans ASP.NET Core implique de configurer votre projet pour séparer les commandes et les requêtes, en utilisant une bibliothèque comme MediatR pour les mettre en lien. Voici un aperçu simplifié de la façon dont vous pouvez configurer CQRS dans votre application ASP.NET Core.

Étape 1 : Configurez Votre Application ASP.NET

  1. Démarrez Visual Studio et choisissez de créer un nouveau projet.
  2. Recherchez et sélectionnez un projet "Application Web ASP.NET Core". Cliquez sur Suivant.

CQRS Pattern C# (Comment ça fonctionne pour les développeurs) : Figure 1 - Création d'un nouveau projet ASP.NET

  1. Donnez un nom à votre projet et définissez son emplacement. Cliquez sur Créer.
  2. Choisissez le modèle "Application Web (Modèle-Vue-Contrôleur)" pour ASP.NET Core. Assurez-vous de cibler la version .NET Core qui répond à vos besoins. Cliquez sur Créer.

Étape 2

Ensuite, vous voudrez organiser votre projet pour CQRS. Vous pouvez le faire en ajoutant des dossiers pour séparer les commandes, les requêtes et les interfaces communes qu'elles utiliseront. Dans l'Explorateur de solutions, cliquez droit sur votre projet, allez dans "Ajouter", puis "Nouveau dossier". Créez trois dossiers : "Commandes", "Requêtes" et "Interfaces".

Dans le dossier "Interfaces", ajoutez des interfaces pour vos commandes et requêtes. Pour une commande, vous pourriez avoir une interface ICommandHandler avec une méthode Handle qui prend une commande et effectue l'action. Pour une requête, vous pourriez avoir une interface IQueryHandler avec une méthode Handle qui prend une requête et renvoie des données.

CQRS Pattern C# (Comment ça fonctionne pour les développeurs) : Figure 2 - Exemple de comment les fichiers pourraient être organisés

Étape 3

Maintenant, ajoutons une commande et une requête pour démontrer. Supposons que votre application gère des tâches, et vous voulez ajouter une tâche (commande) et récupérer des tâches (requête).

Dans le dossier "Interfaces", ajoutez deux interfaces :

// Define interfaces for your handlers:
public interface ICommandHandler<TCommand>
{
    void Handle(TCommand command);
}

public interface IQueryHandler<TQuery, TResult>
{
    TResult Handle(TQuery query);
}
// Define interfaces for your handlers:
public interface ICommandHandler<TCommand>
{
    void Handle(TCommand command);
}

public interface IQueryHandler<TQuery, TResult>
{
    TResult Handle(TQuery query);
}
' Define interfaces for your handlers:
Public Interface ICommandHandler(Of TCommand)
	Sub Handle(ByVal command As TCommand)
End Interface

Public Interface IQueryHandler(Of TQuery, TResult)
	Function Handle(ByVal query As TQuery) As TResult
End Interface
$vbLabelText   $csharpLabel

Dans le dossier "Commandes", ajoutez une classe AddItemCommand avec des propriétés pour les détails de la tâche. Ajoutez également une classe AddItemCommandHandler qui implémente ICommandHandler et contient la logique pour ajouter une tâche à la base de données.

Dans le dossier "Requêtes", ajoutez une classe GetTasksQuery qui représente une demande pour des tâches. Ajoutez une autre classe GetTasksQueryHandler qui implémente IQueryHandler et contient la logique pour récupérer des tâches de la base de données.

Pour un exemple simple, votre AddItemCommand pourrait ressembler à ceci :

public class AddItemCommand
{
    public string Name { get; set; }
    public int Quantity { get; set; }

    // Constructor
    public AddItemCommand(string name, int quantity)
    {
        Name = name;
        Quantity = quantity;
    }
}
public class AddItemCommand
{
    public string Name { get; set; }
    public int Quantity { get; set; }

    // Constructor
    public AddItemCommand(string name, int quantity)
    {
        Name = name;
        Quantity = quantity;
    }
}
Public Class AddItemCommand
	Public Property Name() As String
	Public Property Quantity() As Integer

	' Constructor
	Public Sub New(ByVal name As String, ByVal quantity As Integer)
		Me.Name = name
		Me.Quantity = quantity
	End Sub
End Class
$vbLabelText   $csharpLabel

Et le AddItemCommandHandler :

public class AddItemCommandHandler : ICommandHandler<AddItemCommand>
{
    public void Handle(AddItemCommand command)
    {
        // Here, you'd add the item to your database, for example, to have employee data stored
        Console.WriteLine($"Adding item: {command.Name} with quantity {command.Quantity}");
        // Add database logic here
    }
}
public class AddItemCommandHandler : ICommandHandler<AddItemCommand>
{
    public void Handle(AddItemCommand command)
    {
        // Here, you'd add the item to your database, for example, to have employee data stored
        Console.WriteLine($"Adding item: {command.Name} with quantity {command.Quantity}");
        // Add database logic here
    }
}
Public Class AddItemCommandHandler
	Implements ICommandHandler(Of AddItemCommand)

	Public Sub Handle(ByVal command As AddItemCommand)
		' Here, you'd add the item to your database, for example, to have employee data stored
		Console.WriteLine($"Adding item: {command.Name} with quantity {command.Quantity}")
		' Add database logic here
	End Sub
End Class
$vbLabelText   $csharpLabel

Votre GetItemsQuery pourrait être vide s'il n'a besoin d'aucun paramètre pour récupérer des tâches, et GetItemsQueryHandler pourrait ressembler à ceci :

public class GetItemsQuery
{
    // This class might not need any properties, depending on your query
}

namespace CQRS_testing.Queries
{
    using CQRS_testing.Interfaces;

    public class GetItemsQueryHandler : IQueryHandler<GetItemsQuery, IEnumerable<string>>
    {
        public IEnumerable<string> Handle(GetItemsQuery query)
        {
            // Here, you'd fetch items from your database
            return new List<string> { "Item1", "Item2" };
        }
    }
}
public class GetItemsQuery
{
    // This class might not need any properties, depending on your query
}

namespace CQRS_testing.Queries
{
    using CQRS_testing.Interfaces;

    public class GetItemsQueryHandler : IQueryHandler<GetItemsQuery, IEnumerable<string>>
    {
        public IEnumerable<string> Handle(GetItemsQuery query)
        {
            // Here, you'd fetch items from your database
            return new List<string> { "Item1", "Item2" };
        }
    }
}
Imports CQRS_testing.Interfaces

Public Class GetItemsQuery
	' This class might not need any properties, depending on your query
End Class

Namespace CQRS_testing.Queries

	Public Class GetItemsQueryHandler
		Implements IQueryHandler(Of GetItemsQuery, IEnumerable(Of String))

		Public Function Handle(ByVal query As GetItemsQuery) As IEnumerable(Of String)
			' Here, you'd fetch items from your database
			Return New List(Of String) From {"Item1", "Item2"}
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

Dans vos contrôleurs ASP.NET, vous utiliserez ces gestionnaires pour traiter les commandes et les requêtes. Pour ajouter une tâche, l'action du contrôleur créerait une AddTaskCommand, définirait ses propriétés à partir des données du formulaire, puis la passerait à une instance de AddTaskCommandHandler à traiter. Pour récupérer des tâches, il appellerait un GetTasksQueryHandler pour obtenir les données et les passerait à la vue.

Connexion dans un Contrôleur

Avec vos commandes et requêtes configurées, vous pouvez maintenant les utiliser dans vos contrôleurs. Voici comment vous pourriez le faire dans une classe ItemsController :

public class ItemsController : Controller
{
    private readonly ICommandHandler<AddItemCommand> _addItemHandler;
    private readonly IQueryHandler<GetItemsQuery, IEnumerable<string>> _getItemsHandler;

    // Constructor injection is correctly utilized here
    public ItemsController(ICommandHandler<AddItemCommand> addItemHandler, IQueryHandler<GetItemsQuery, IEnumerable<string>> getItemsHandler)
    {
        _addItemHandler = addItemHandler;
        _getItemsHandler = getItemsHandler;
    }

    public IActionResult Index()
    {
        // Use the injected _getItemsHandler instead of creating a new instance
        var query = new GetItemsQuery();
        var items = _getItemsHandler.Handle(query);
        return View(items);
    }

    [HttpPost]
    public IActionResult Add(string name, int quantity)
    {
        // Use the injected _addItemHandler instead of creating a new instance
        var command = new AddItemCommand(name, quantity);
        _addItemHandler.Handle(command);
        return RedirectToAction("Index");
    }
}
public class ItemsController : Controller
{
    private readonly ICommandHandler<AddItemCommand> _addItemHandler;
    private readonly IQueryHandler<GetItemsQuery, IEnumerable<string>> _getItemsHandler;

    // Constructor injection is correctly utilized here
    public ItemsController(ICommandHandler<AddItemCommand> addItemHandler, IQueryHandler<GetItemsQuery, IEnumerable<string>> getItemsHandler)
    {
        _addItemHandler = addItemHandler;
        _getItemsHandler = getItemsHandler;
    }

    public IActionResult Index()
    {
        // Use the injected _getItemsHandler instead of creating a new instance
        var query = new GetItemsQuery();
        var items = _getItemsHandler.Handle(query);
        return View(items);
    }

    [HttpPost]
    public IActionResult Add(string name, int quantity)
    {
        // Use the injected _addItemHandler instead of creating a new instance
        var command = new AddItemCommand(name, quantity);
        _addItemHandler.Handle(command);
        return RedirectToAction("Index");
    }
}
Public Class ItemsController
	Inherits Controller

	Private ReadOnly _addItemHandler As ICommandHandler(Of AddItemCommand)
	Private ReadOnly _getItemsHandler As IQueryHandler(Of GetItemsQuery, IEnumerable(Of String))

	' Constructor injection is correctly utilized here
	Public Sub New(ByVal addItemHandler As ICommandHandler(Of AddItemCommand), ByVal getItemsHandler As IQueryHandler(Of GetItemsQuery, IEnumerable(Of String)))
		_addItemHandler = addItemHandler
		_getItemsHandler = getItemsHandler
	End Sub

	Public Function Index() As IActionResult
		' Use the injected _getItemsHandler instead of creating a new instance
		Dim query = New GetItemsQuery()
		Dim items = _getItemsHandler.Handle(query)
		Return View(items)
	End Function

	<HttpPost>
	Public Function Add(ByVal name As String, ByVal quantity As Integer) As IActionResult
		' Use the injected _addItemHandler instead of creating a new instance
		Dim command = New AddItemCommand(name, quantity)
		_addItemHandler.Handle(command)
		Return RedirectToAction("Index")
	End Function
End Class
$vbLabelText   $csharpLabel

Pour tout connecter, surtout si vous utilisez l'injection de dépendance (DI) dans ASP.NET Core, vous devrez enregistrer vos gestionnaires de commandes et de requêtes avec le conteneur DI dans le fichier Startup.cs. De cette façon, ASP.NET pourra fournir des instances de vos gestionnaires lorsqu'elles seront nécessaires.

Voici un exemple très basique d'enregistrement d'un gestionnaire :

builder.Services.AddTransient<ICommandHandler<AddItemCommand>, AddItemCommandHandler>();
builder.Services.AddTransient<IQueryHandler<GetItemsQuery, IEnumerable<string>>, GetItemsQueryHandler>();
builder.Services.AddTransient<ICommandHandler<AddItemCommand>, AddItemCommandHandler>();
builder.Services.AddTransient<IQueryHandler<GetItemsQuery, IEnumerable<string>>, GetItemsQueryHandler>();
builder.Services.AddTransient(Of ICommandHandler(Of AddItemCommand), AddItemCommandHandler)()
builder.Services.AddTransient(Of IQueryHandler(Of GetItemsQuery, IEnumerable(Of String)), GetItemsQueryHandler)()
$vbLabelText   $csharpLabel

Dans l'application pratique du CQRS, la distinction entre le modèle de données pour les opérations d'écriture et celui pour les opérations de lecture est fondamentale, garantissant que l'architecture prend en charge des approches variées et optimisées pour gérer les données.

IronPDF : Bibliothèque PDF C

CQRS Pattern C# (Comment ça fonctionne pour les développeurs) : Figure 3 - Page web IronPDF

Explorez IronPDF pour la gestion de PDF est un outil pour les développeurs travaillant avec le langage de programmation C#, leur permettant de créer, lire et éditer des documents PDF directement dans leurs applications. Cette bibliothèque est conviviale, facilitant l'intégration de fonctionnalités PDF telles que la génération de rapports PDF, de factures ou la création de PDFs à partir de code HTML. IronPDF prend en charge diverses fonctionnalités, notamment la modification de texte et d'images dans les PDFs, la configuration de la sécurité des documents, et la conversion de pages web au format PDF. Sa polyvalence et sa facilité d'utilisation en font une ressource précieuse pour les développeurs souhaitant implémenter des opérations PDF dans leurs projets.

IronPDF excelle par sa capacité de conversion HTML en PDF, en gardant intacts tous les mises en page et styles. Il crée des PDFs à partir de contenu web, adapté pour des rapports, des factures et de la documentation. Les fichiers HTML, les URLs et les chaînes HTML peuvent être convertis en PDFs sans problème.

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

Exemple de code

Voyons maintenant comment IronPDF peut être utilisé dans une application C# suivant le schéma de Command Query Responsibility Segregation (CQRS). Voici un exemple simplifié démontrant comment vous pourriez utiliser IronPDF dans une configuration CQRS pour générer un rapport PDF. Cet exemple est conceptuel et se concentre sur la génération d'un document PDF comme une commande.

using IronPdf;
using System.Threading.Tasks;

namespace PdfGenerationApp.Commands
{
    public class GeneratePdfReportCommand
    {
        // Command handler that generates a PDF report
        public async Task GenerateReportAsync(string reportContent, string outputPath)
        {
            // Initialize the IronPDF HTML to PDF renderer
            var renderer = new ChromePdfRenderer();
            // Use IronPDF to generate a PDF from HTML content
            var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf(reportContent));
            // Save the generated PDF to a specified path
            pdf.SaveAs(outputPath);
        }
    }
}
using IronPdf;
using System.Threading.Tasks;

namespace PdfGenerationApp.Commands
{
    public class GeneratePdfReportCommand
    {
        // Command handler that generates a PDF report
        public async Task GenerateReportAsync(string reportContent, string outputPath)
        {
            // Initialize the IronPDF HTML to PDF renderer
            var renderer = new ChromePdfRenderer();
            // Use IronPDF to generate a PDF from HTML content
            var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf(reportContent));
            // Save the generated PDF to a specified path
            pdf.SaveAs(outputPath);
        }
    }
}
Imports IronPdf
Imports System.Threading.Tasks

Namespace PdfGenerationApp.Commands
	Public Class GeneratePdfReportCommand
		' Command handler that generates a PDF report
		Public Async Function GenerateReportAsync(ByVal reportContent As String, ByVal outputPath As String) As Task
			' Initialize the IronPDF HTML to PDF renderer
			Dim renderer = New ChromePdfRenderer()
			' Use IronPDF to generate a PDF from HTML content
			Dim pdf = Await Task.Run(Function() renderer.RenderHtmlAsPdf(reportContent))
			' Save the generated PDF to a specified path
			pdf.SaveAs(outputPath)
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

Dans cet exemple, GeneratePdfReportCommand représente une commande dans le schéma CQRS. Il comprend une méthode GenerateReportAsync qui prend reportContent comme une chaîne HTML et un outputPath où le rapport PDF sera enregistré. La classe HtmlToPdf d'IronPDF est utilisée pour convertir le contenu HTML en format PDF, qui est ensuite enregistré au chemin spécifié. Cette configuration illustre comment vous pouvez intégrer la fonctionnalité de génération de PDF dans l'architecture de votre application, surtout dans des scénarios nécessitant une séparation claire des préoccupations, comme promue par CQRS.

CQRS Pattern C# (Comment ça fonctionne pour les développeurs) : Figure 4 - PDF généré

Conclusion

CQRS Pattern C# (Comment ça fonctionne pour les développeurs) : Figure 5 - Informations sur la licence IronPDF

Pour conclure, le modèle Command Query Responsibility Segregation (CQRS) offre une approche structurée pour séparer les responsabilités de lecture et d'écriture de données dans vos applications. Cette séparation non seulement clarifie l'architecture mais améliore également la flexibilité, la scalabilité et les performances de vos systèmes. En suivant les étapes décrites ci-dessus, vous pouvez implémenter CQRS dans vos applications ASP.NET Core, en utilisant des outils comme MediatR pour simplifier la communication entre commandes, requêtes et leurs gestionnaires.

Intégrer IronPDF dans votre application basée sur CQRS élargit encore ses capacités, vous permettant de créer, manipuler et stocker sans effort des documents PDF. Que vous génériez des rapports, des factures ou toute autre forme de document, les fonctionnalités complètes d'IronPDF et sa syntaxe simple en font un outil puissant dans votre boîte à outils de développement. IronPDF propose une version d'essai gratuite, vous donnant l'occasion d'explorer ses capacités avant de vous engager. Pour une utilisation continue, les licences commencent à partir de $799, offrant diverses options pour satisfaire les besoins de votre projet.

Questions Fréquemment Posées

Qu'est-ce que le modèle CQRS en développement logiciel ?

Le modèle CQRS, ou Command Query Responsibility Segregation, est une stratégie de conception qui sépare la lecture des données de l'écriture dans les applications. Cette séparation permet une optimisation indépendante des opérations de commande (écriture) et de requête (lecture), améliorant les performances et l'évolutivité.

Comment le CQRS peut-il améliorer les performances des applications .NET ?

Le CQRS améliore les performances des applications .NET en utilisant des modèles de données distincts pour les opérations de lecture et d'écriture, permettant aux développeurs d'optimiser chaque partie indépendamment. Cela conduit à une meilleure évolutivité et à une efficacité accrue dans la gestion de la logique métier complexe.

Quels sont les avantages d'utiliser MediatR dans une configuration CQRS ?

MediatR est une bibliothèque de modèle médiateur qui facilite le CQRS en réduisant le couplage entre les composants dans les applications .NET. Il agit comme un intermédiaire, gérant les interactions entre les commandes, les requêtes et leurs gestionnaires.

Comment IronPDF complète-t-il le modèle CQRS dans les applications C# ?

IronPDF complète le modèle CQRS en offrant des capacités robustes de manipulation de PDF. Il permet aux développeurs de générer, lire et éditer des documents PDF dans les applications, ce qui en fait un outil idéal pour créer des rapports PDF dans le cadre des opérations de commande dans une configuration CQRS.

Pourquoi est-il bénéfique de séparer les commandes et les requêtes dans un projet ASP.NET Core ?

Séparer les commandes et les requêtes dans un projet ASP.NET Core améliore l'organisation et la clarté. Cela permet aux développeurs de gérer chaque aspect de manière indépendante, améliorant la maintenabilité et alignant avec les principes du modèle CQRS.

Quel rôle joue l'injection de dépendances dans une architecture CQRS ?

L'injection de dépendances est cruciale dans une architecture CQRS car elle permet l'enregistrement et la fourniture transparents de gestionnaires de commandes et de requêtes. Cela garantit que les applications ASP.NET Core peuvent résoudre efficacement les dépendances et gérer les instances des gestionnaires selon les besoins.

Comment puis-je convertir du HTML en PDF en C# en utilisant une bibliothèque ?

Vous pouvez utiliser la méthode RenderHtmlAsPdf d'IronPDF pour convertir des chaînes HTML en PDFs. Elle prend également en charge la conversion de fichiers HTML en PDFs en utilisant RenderHtmlFileAsPdf, ce qui est utile pour générer des rapports et de la documentation.

Puis-je évaluer une bibliothèque PDF C# avant l'achat ?

Oui, IronPDF propose une version d'essai gratuite, permettant aux développeurs de découvrir ses fonctionnalités et ses capacités avant de prendre une décision d'achat.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite