.NET ヘルプ

Autofac .NET 6(開発者向けの動作方法)

Kannaopat Udonpant
カンナパット・ウドンパント
2024年7月1日
共有:

.NET開発の分野では、依存関係を効率的に管理することが、スケーラブルで保守可能、かつテストしやすいアプリケーションを構築する上で非常に重要です。 依存性注入(DI)これらの目標を達成する上で、コンテナは制御の反転を容易にすることにより、重要な役割を果たします。(IoC)原則。 多数の一般的なホスティングメカニズムライブラリが利用可能である中で、Autofacは.NETのための機能豊富で拡張可能なフレームワークとして際立っています。

この記事では、Autofac .NET 6を探求する旅に出かけ、その特徴と利点を解き明かしながら、実際の使用例を紹介します。 この記事の後半では、Iron Softwareの強力なPDF生成ライブラリであるIronPDFについて学びます。 Autofac.NETとIronPDFを一緒に使用するユースケースも紹介します。

Autofac .NETを理解する

Autofacは、.NET向けのオープンソースのIoCコンテナで、ウェブAPIのようなアプリにおける依存関係注入とコンポーネント登録の包括的なサポートを提供します。Nicholas Blumhardtによって開発され、献身的なコミュニティによって維持されているAutofacは、オブジェクトのライフタイムを管理し、依存関係を解決し、アプリケーションコンポーネントを構築するための堅牢かつ柔軟なソリューションを提供します。

Autofacがお客様の.NETアプリケーションをどのように強化するかについての詳細は、以下のリソースをご参照ください。IronPDF .NET PDFライブラリ またIronBarcodeの.NETバーコードライブラリバーコード生成における依存性注入の実用的なアプリケーションをご覧ください。

実際のシナリオでAutofacを使用した、さらなる洞察と実践例をご覧ください。IronSoftware の公式ページAutofacとシームレスに統合し、.NET開発プロセスを向上させるIronOCRやIronXLのような包括的な製品群をご覧いただけます。

Autofacの特徴

  1. コンテナの構築とコンポーネントの登録:コンポーネントをスタートアップクラスに登録することで、Autofacを使用してコンテナを構築できます。 コンポーネントは、ラムダ、型、または事前構築されたインスタンスを使用して登録できます。
    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();
        }
    }
  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;
        }
    }
  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>();
        }
    }
  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();

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();
        }
    }
}

このセクションでは、依存性注入のためのAutofac.NETの実用的な実装を示しました。 手動登録からアセンブリスキャンおよびモジュールベースの登録に至るまで、Autofac が依存関係の管理に提供する柔軟性を示しました。 これらの技術を活用することで、開発者はアプリケーションの依存性注入プロセスを効率化し、保守性とスケーラビリティを向上させることができます。

Iron Softwareの製品がどのように.NETアプリケーションと統合され、さらに合理化され、機能が強化されるかについての詳細は、以下をご覧ください。IronPDF ドキュメントプログラムによるPDFドキュメントの生成と編集方法については、以下をご覧ください。Iron Softwareのウェブサイトバーコードの読み取りと書き込みのためのIronBarcodeや高度な光学式文字認識のためのIronOCRのような強力な.NETライブラリの広い範囲を発見するために。

Autofac.NETの使用のメリット

  1. シンプルさと柔軟性: Autofacは、コンポーネントの登録と解決のためのシンプルで直感的なAPIを提供しており、依存性注入の実装と保守を簡単にします。

  2. テスト容易性と保守性: 疎結合と依存関係の逆転を促進することにより、Autofacは.NETアプリケーションのテスト容易性と保守性を向上させ、ユニットテストやリファクタリングを容易にします。

  3. パフォーマンスとスケーラビリティ: Autofac の軽量で効率的なランタイムパフォーマンスは、高性能アプリケーションおよび大規模なオブジェクトグラフを持つスケーラブルなシステムに適しています。

  4. 拡張性とカスタマイズ: Autofacの拡張可能なアーキテクチャは、開発者がカスタムモジュール、登録ソース、およびミドルウェアコンポーネントを通じてAutofacの動作を拡張およびカスタマイズできるようにし、多様なアプリケーション要件に対応します。

  5. コミュニティとサポート: 活発な開発者コミュニティと包括的なドキュメントを備えたAutofacは、フレームワークの学習、トラブルシューティング、貢献に対して優れたサポートとリソースを提供します。

Autofac ライセンス

Autofacは、開発および商業目的で無料で使用できるMITライセンスが付属しています。

Iron SoftwareからのIronPDFをご紹介します。

Autofac .NET 6(開発者向けの動作方法):図1 - IronPDFのウェブページ

IronPDFは、.NETプロジェクトでPDFを管理するための包括的なソリューションを提供するように設計された堅牢なC# PDFライブラリです。 PDFドキュメントの作成、編集、エクスポート、セキュリティ、ロード、または操作が必要な場合でも、IronPDFには必要なツールが揃っています。 以下はその際立った機能と応用例です:

主な機能

  • HTMLからPDFへの変換:簡単にHTMLコンテンツをPDFに変換します。 HTML、MVC、ASPX、および画像からPDFを生成。
  • PDF管理: 50以上の機能を備えたIronPDFは、PDFに署名し、編集し、コンテンツを抽出することができ、デジタル署名や変更が容易になります。
  • クロスプラットフォーム対応: IronPDFはC#、F#、およびVB.NETと互換性があり、.NET Core、.NET Standard、.NET Frameworkを含むさまざまな.NETバージョンで実行されます。 それはJava、Node.js、およびPythonでも利用可能です。

    IronPDFがあなたのプロジェクトにどのようにPDFの機能を統合できるかについてもっと知りたい方はIronPdf製品ページ.

    IronBarcode、IronOCRなどを含むIron Softwareの製品の包括的な概要については、こちらをご覧ください。Iron Softwareホームページ.

互換性と環境

  • .NETバージョン:C#、VB.NET、およびF#をサポートします。
  • プロジェクトのタイプ: ウェブに適している(IronPDFによるBlazorとWebForms)デスクトップ(WPF & MAUI)およびコンソールアプリケーション。
  • アプリケーション環境: Windows、Linux、Mac、Docker、Azure、AWS などに対応。
  • IDEs:とシームレスに統合マイクロソフト ビジュアルスタジオ以下のコンテンツを日本語に翻訳してください:JetBrains Rider.
  • OS & プロセッサ: Windows、Mac、およびLinuxで動作します(x64、x86、ARM).

PDFの標準と編集

  • 互換性: 各種PDFバージョンをサポート(1.2 - 1.7), PDF/UA、およびPDF/A.
  • カスタマイズ: PDFファイルのプロパティ、セキュリティ、および圧縮を設定します。
  • メタデータと構造: メタデータ、履歴の編集、ドキュメントの構造を編集します。
  • テンプレートと設定: ページテンプレート、ヘッダー、フッター、およびページ設定を適用します。

    これらの機能とその実装方法の詳細についてはIronPDFの公式サイトにPDF生成と操作の詳細ガイドがあります。.

パフォーマンス最適化

  • 効率:効率的なPDF生成のための完全なマルチスレッドおよび非同期サポート。
  • 優先事項: 正確さ、使いやすさ、および速度に重点を置いています。

    では、これらの2つのライブラリを使用した実際の例を見てみましょう。

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");
        }
    }
}

コードの説明

では、提供していただいたコードスニペットを分解してみましょう。

  1. ChromePdfRenderer セットアップ

    • このコードは、HTMLコンテンツからPDFをレンダリングするためのChromePdfRendererインスタンスを初期化します。IronPDF.
  2. HTMLコンテンツの準備:

    • content 変数は、PDF を生成するために使用される HTML 文字列です。

      • 以下の内容を日本語に翻訳してください:

<h1> タグには「IronPDFを使ったAutofacのデモンストレーション」というタイトルが含まれています。

  1. Autofacコンテナのセットアップ:

    • コードは ContainerBuilder という名前のインスタンス builder を作成します。

    • これは依存性注入のためにAutofacコンテナを設定する最初のステップです。
  2. タイプを手動で登録する:

    • それは、IMyServiceインターフェースの実装として、MyService型を登録します。

    • これにより、Autofacは必要に応じて依存関係を解決することができます。
  3. アセンブリスキャンを使用してタイプを登録する

    • アセンブリに含まれるAutoFacタイプをスキャンします。

    • "Repository"で終わる名前を持つ型を、それに対応するインターフェースの実装として登録します。
  4. モジュールの登録:

    • それは「MyModule」と呼ばれるモジュールを登録します。

    • モジュールは関連する登録をグループ化することを可能にします。
  5. コンテナの構築

    • コンテナは、builder.Build を使用して登録されたコンポーネントから作成されます。()メソッド
  6. 依存関係の解決:

    • ライフタイムスコープ内(使用(var scope = container.BeginLifetimeScope())もちろん、英語のテキストを教えていただけますでしょうか?)それは IMyService のインスタンスを解決します。

    • 解決されたサービスで DoSomething メソッドが呼び出されます。
  7. PDF生成

    • コンテンツから ChromePdfRenderer を使用してPDFが作成されます。

    • 結果として生成されたPDFは「autofac.pdf」として保存されます。

出力

Autofac .NET 6(開発者向けの使い方):図6 - 前のコード例から出力されたPDF

IronPDFライセンス

IronPDFにはライセンスキーが必要です。 以下に示すように、appSettings.jsonファイルにライセンスキーを配置してください。

{
  "IronPdf.License.LicenseKey": "The Key Here"
}
Kannaopat Udonpant
カンナパット・ウドンパント
ソフトウェアエンジニア
ソフトウェアエンジニアになる前に、カンナパットは日本の北海道大学から環境資源学の博士号を取得しました。学位を取得する過程で、カンナパットはバイオプロダクション工学部に所属する車両ロボティクス研究所のメンバーにもなりました。2022年には、C#のスキルを活かしてIron Softwareのエンジニアリングチームに参加し、IronPDFに注力しています。カンナパットは、IronPDFで使用されているコードの大部分を作成した開発者から直接学べることに価値を見いだしています。同僚との学び合いに加えて、Iron Softwareで働くことの社会的側面も楽しんでいます。コードやドキュメントを書いていない時には、カンナパットは通常、PS5でゲームをしたり、『The Last of Us』を再視聴したりしています。
< 以前
OpenTelemetry .NET(開発者向けの仕組み)
次へ >
Papercut SMTP C#(開発者向けの動作方法)