.NET 幫助

Autofac .NET 6(開發人員如何使用)

在 .NET 開發領域,有效地管理相依性對於建立可擴展、可維護和可測試的應用程式至關重要。 依賴注入(DI)容器在通過促進控制反轉(IoC)原則來實現這些目標方面發揮了關鍵作用。 在眾多可用的通用託管機制庫中,Autofac 作為一個功能豐富且可擴展的 .NET 框架脫穎而出。

在本文中,我們將展開一段探索Autofac .NET 6的旅程,闡明其功能和優勢,以展示其使用的實際範例。 在本文的後面部分,我們將學習IronPDF,一個來自Iron Software的強大PDF生成庫。 我們也將展示一個使用案例,其中 Autofac.NET 和 IronPDF 一同使用。

理解 Autofac .NET

Autofac 是一個開源的 .NET IoC 容器,為像 Web API 這樣的應用程序提供全面的依賴注入和組件註冊支援。由 Nicholas Blumhardt 開發並由一個專注的社群維護,Autofac 提供了一個強大而靈活的解決方案來管理物件生命週期、解決依賴關係以及組合應用程式元件。

如需了解更多有關 Autofac 如何增強您的 .NET 應用程式的資訊,請考慮探索由IronPDF's .NET PDF Library提供的資源,其中強調了 PDF 生成和操作的高級功能。 您還可以深入了解IronBarcode 的 .NET 條碼庫,以查看依賴注入在條碼生成中的實際應用。

透過造訪IronSoftware的官方頁面,了解如何在真實世界場景中使用Autofac的更多見解和實用範例。在那裡,您將發現一整套產品,如IronOCR和IronXL,這些產品與Autofac無縫整合,並提升您的.NET開發流程。

Autofac 的特點

  1. 容器構建和元件註冊:您可以使用 Autofac 在啟動類中註冊元件來構建容器。 您可以使用 lambda 表達式、類型或預建的實例來註冊元件。
    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
$vbLabelText   $csharpLabel
  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
$vbLabelText   $csharpLabel
  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
$vbLabelText   $csharpLabel
  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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

在本節中,我們展示了Autofac.NET進行依賴注入的實際應用。 從手動註冊到組件掃描和基於模組的註冊,我們已展示了Autofac在管理依賴性方面所提供的靈活性。 通過使用這些技術,開發者可以精簡應用程式的依賴性注入過程,提升可維護性和可擴展性。

欲了解更多關於如何將 Iron Software 的產品整合到您的 .NET 應用程式中以進一步簡化和增強功能,請參閱 IronPDF 文檔,在那裡您可以學習如何以程式方式生成和編輯 PDF 文檔,或者造訪 Iron Software 的網站,發現一系列強大的 .NET 庫,如用於讀寫條碼的 IronBarcode 和進階光學文字識別的 IronOCR。

使用Autofac.NET的優點

  1. 簡便性和靈活性:Autofac 提供了一個簡單而直觀的 API,用於註冊和解析組件,使得依賴注入易於實現和維護。

  2. 可測試性與可維護性:透過促進鬆散耦合與依賴反轉,Autofac 增強了 .NET 應用程式的可測試性與可維護性,使單元測試與重構更加容易。

  3. 效能與擴展性:Autofac 的輕量級和高效能執行效能使其適用於高性能應用程式以及具有大型物件圖的可擴展系統。

  4. 擴展性和自定義:Autofac 的可擴展架構允許開發人員通過自定義模組、註冊來源和中介元件來擴展和自定義 Autofac 的行為,以滿足各種應用需求。

  5. 社群與支援:Autofac 擁有活躍的開發者社群和全面的文件資源,提供了學習、故障排除和對框架做出貢獻的卓越支援和資源。

Autofac License

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 進行簽名、編輯和提取內容,使數字簽名和修改變得輕鬆。
  • 跨平台支持:兼容 C#、F# 和 VB.NET,IronPDF 可在多种 .NET 版本上运行,包括 .NET Core、.NET Standard 和 .NET Framework。 它也適用於 Java、Node.js 和 Python。

    若要進一步了解如何將 IronPDF 的 PDF 功能整合到您的專案中,請造訪 IronPDF 產品頁面

    要全面了解Iron Software的產品,包括IronBarcode、IronOCR及其他,請訪問Iron Software主頁

相容性和環境

  • .NET 版本:支援 C#、VB.NET 和 F#。
  • 專案類型:適用於網頁 (Blazor 和 使用 IronPDF 的 WebForms)、桌面 (WPF 和 MAUI) 和控制台應用程式。
  • 應用環境:兼容於 Windows、Linux、Mac、Docker、Azure、AWS 等。
  • IDEs:無縫整合 Microsoft Visual StudioJetBrains Rider
  • 作業系統及處理器:適用於 Windows、Mac 和 Linux(x64、x86、ARM)。

PDF 標準與編輯

  • 相容性:支援多種 PDF 版本(1.2 - 1.7)、PDF/UA 和 PDF/A。
  • 自訂:設定 PDF 檔案的屬性、安全性和壓縮。
  • 中繼資料和結構:編輯中繼資料、修訂歷史和文件結構。
  • 模板與設定:套用頁面模板、頁首、頁尾及頁面設定。

    如需了解更多關於這些功能及其實施方式的信息,請訪問IronPDF官方網站上的詳細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套件

訪問IronPDF 文件以獲取有關安裝和使用 IronPDF 庫的更多信息。

從 Visual Studio 套件管理器的 NuGet 套件中安裝 Autofac

Autofac .NET 6(對開發人員的工作原理):圖 5 - 安裝必要的 Autofac 套件

了解更多有關Autofac的資訊,請造訪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
$vbLabelText   $csharpLabel

程式碼說明

讓我們分解您提供的程式碼片段:

  1. ChromePdfRenderer 設置

    • 此代碼初始化ChromePdfRenderer實例以從HTML內容中渲染PDF,這是<IronPDF的關鍵功能。
  2. HTML內容準備

    • content 變數是一個將用於生成 PDF 的 HTML 字串。

    • 它包括一個<h1>標籤,標題為 "Demonstrate Autofac with IronPDF"。
  3. 設定 Autofac Container

    • 此程式碼創建一個名為builderContainerBuilder實例。

    • 這是設置 Autofac 容器以進行依賴注入的第一步。
  4. 手動註冊類型

    • 它將類型MyService註冊為IMyService介面的實現。

    • 這允許 Autofac 在需要時解析依賴項。
  5. 使用程序集掃描註冊類型

    • 它掃描包含AutoFac類型的組件。

    • 註冊名稱以「Repository」結尾的類型作為其相應接口的實現。
  6. 註冊模組

    • 它註冊了一個名為MyModule的模組。

    • 模組允許將相關的註冊進行分組。
  7. 建置容器

    • 該容器使用 builder.Build() 方法從註冊的組件中構建。
  8. 解決相依性

    • 在一個生命範圍內(using (var scope = container.BeginLifetimeScope())),它解析了一個IMyService的實例。

    • 在解析的服務上調用DoSomething方法。
  9. PDF生成

    • 使用ChromePdfRenderer從內容創建PDF。

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

輸出

Autofac .NET 6(它如何為開發者工作):圖 6 - 來自前一個代碼範例的輸出 PDF

IronPDF 授權

IronPDF需要許可證金鑰。 將授權金鑰放置在 appSettings.json 文件中,如下所示。

{
  "IronPdf.License.LicenseKey": "The Key Here"
}
Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
OpenTelemetry .NET(對開發人員的運作方式)
下一個 >
Papercut SMTP C#(開發人員如何使用)