成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET 中優秀依賴注入框架Autofac看一篇就夠了

開發 后端
Autofac 是一個強大的 .NET 依賴注入容器,它提供了多種注冊方式、屬性注入以及合并多個 ContainerBuilder 的功能,使你能夠更靈活地管理對象的生命周期和解決依賴關系。

Autofac 是一個功能豐富的 .NET 依賴注入容器,用于管理對象的生命周期、解決依賴關系以及進行屬性注入。本文將詳細講解 Autofac 的使用方法,包括多種不同的注冊方式,屬性注入,以及如何使用多個 ContainerBuilder 來注冊和合并組件。我們將提供詳細的源代碼示例來說明每個概念。

1、安裝 Autofac

首先,確保你已經安裝了 Autofac NuGet 包。你可以使用 NuGet 包管理器或通過控制臺運行以下命令來安裝 Autofac:

Install-Package Autofac

2、創建一個簡單的控制臺應用程序

我們將從一個簡單的控制臺應用程序開始,以演示 Autofac 的基本用法。我們將創建一個包含多個組件的容器,并演示多種注冊方式以及屬性注入的方法。

Program.cs

using System;
using Autofac;

namespace AutofacExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 步驟 1:創建 ContainerBuilder
            var builder = new ContainerBuilder();

            // 步驟 2:注冊組件
            builder.RegisterType<DatabaseConnection>().As<IDatabaseConnection>().SingleInstance();
            builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
            builder.RegisterType<Logger>().As<ILogger>().Named<ILogger>("ConsoleLogger");

            // 步驟 3:構建容器
            var container = builder.Build();

            // 步驟 4:解析組件并進行屬性注入
            using (var scope = container.BeginLifetimeScope())
            {
                var userRepository = scope.Resolve<IUserRepository>();
                userRepository.AddUser("John Doe");

                // 屬性注入示例
                var logger = scope.ResolveNamed<ILogger>("ConsoleLogger");
                logger.Log("This is a log message with attribute injection.");
            }

            Console.WriteLine("Press Enter to exit...");
            Console.ReadLine();
        }
    }
}

3、創建組件和接口

現在,我們將創建三個組件 DatabaseConnectionUserRepository  Logger,以及它們所實現的接口。

DatabaseConnection.cs

public interface IDatabaseConnection
{
    void Connect();
}

public class DatabaseConnection : IDatabaseConnection
{
    public void Connect()
    {
        Console.WriteLine("Connected to the database.");
    }
}

UserRepository.cs

public interface IUserRepository
{
    void AddUser(string username);
}

public class UserRepository : IUserRepository
{
    private readonly IDatabaseConnection _databaseConnection;

    public UserRepository(IDatabaseConnection databaseConnection)
    {
        _databaseConnection = databaseConnection;
    }

    public void AddUser(string username)
    {
        _databaseConnection.Connect();
        Console.WriteLine($"User '{username}' added to the database.");
    }
}

Logger.cs

public interface ILogger
{
    void Log(string message);
}

public class Logger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine($"Logging: {message}");
    }
}

4、多種注冊方式

Autofac 提供了多種不同的組件注冊方式,允許你控制組件的生命周期、解決復雜的依賴關系和應用更高級的用法。以下是一些常見的注冊方式:

(1)單例注冊

你可以注冊一個組件為單例,這意味著容器將返回同一個實例,直到容器被銷毀。在示例中,我們使用 SingleInstance() 方法將 DatabaseConnection 注冊為單例。

builder.RegisterType<DatabaseConnection>().As<IDatabaseConnection>().SingleInstance();

(2)生命周期范圍注冊

你可以將組件注冊為具有特定生命周期范圍,例如單次請求或單個生命周期。在示例中,我們使用 InstancePerLifetimeScope() 方法將 UserRepository 注冊為單個生命周期。

builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();

(3)命名注冊

你可以注冊組件并為其指定一個名稱,以便在解析時根據名稱來選擇不同的實現。在示例中,我們使用 Named<TService, TImplementer>(string name) 方法為 Logger 注冊一個名為 "ConsoleLogger" 的實現。

builder.RegisterType<Logger>().As<ILogger>().Named<ILogger>("ConsoleLogger");

(4)Lambda 表達式注冊

你可以使用 Lambda 表達式注冊一個組件,以根據需要創建實例。在示例中,我們使用 Lambda 表達式注冊 DatabaseConnection

builder.Register(c => new DatabaseConnection()).As<IDatabaseConnection>();

(5) 泛型組件注冊

你可以注冊泛型組件,允許你在解析時提供類型參數。在示例中,我們使用 RegisterGeneric 方法注冊泛型組件 GenericRepository<T>

builder.RegisterGeneric(typeof(GenericRepository<>)).As(typeof(IGenericRepository<>));

5、屬性注入

Autofac 允許你進行屬性注入,這意味著你可以在組件實例化后注入屬性的值。在示例中,我們演示了如何使用屬性注入將 ILogger 注入到 UserRepository 中。

首先,我們需要為 UserRepository 類添加一個屬性,并使用 [Autowired] 特性進行標記:

public class UserRepository : IUserRepository
{
    private readonly IDatabaseConnection _databaseConnection;

    // 使用 [Autowired] 特性進行屬性注入
    [Autowired]
    public ILogger Logger { get; set; }

    public UserRepository(IDatabaseConnection databaseConnection)
    {
        _databaseConnection = databaseConnection;
    }

    public void AddUser(string username)
    {
        _databaseConnection.Connect();
        Console.WriteLine($"User '{username}' added to the database.");

        // 使用注入的 Logger
        Logger.Log("User added.");
    }
}

接下來,我們需要在容器構建前啟用屬性注入。這可以通過配置 ContainerBuilder 來實現:

var builder = new ContainerBuilder();
builder.RegisterType<DatabaseConnection>().As<IDatabaseConnection>().SingleInstance

();
builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
builder.RegisterType<Logger>().As<ILogger>().Named<ILogger>("ConsoleLogger");

// 啟用屬性注入
builder.RegisterCallback(PropertyInjector.InjectProperties);

var container = builder.Build();

現在,當 UserRepository 被解析時,Logger 屬性將自動注入,從而實現屬性注入。

6、使用多個ContainerBuilder合并注冊

有時候,你可能需要在不同的模塊或程序部分中注冊組件。對于這種情況,你可以使用多個 ContainerBuilder 對象,并最終將它們合并到一個主容器中。下面是如何實現這一點的示例:

Program.cs(擴展)

在上面的示例中,我們已經創建了一個容器并注冊了組件。現在,我們將添加一個額外的 ContainerBuilder,注冊另一個組件,然后將它們合并。

// 步驟 7:使用另一個 ContainerBuilder 注冊另一個組件
var builder2 = new ContainerBuilder();
builder2.RegisterType<EmailSender>().As<IEmailSender>();

// 步驟 8:合并 ContainerBuilder
builder.Update(builder2);

EmailSender.cs

public interface IEmailSender
{
    void SendEmail(string to, string subject, string message);
}

public class EmailSender : IEmailSender
{
    public void SendEmail(string to, string subject, string message)
    {
        Console.WriteLine($"Sending email to {to} with subject: {subject}");
        Console.WriteLine($"Message: {message}");
    }
}

現在,我們已經注冊了一個名為 EmailSender 的額外組件,并將其合并到主容器中。

7、使用多個 ContainerBuilder 示例

這是完整的示例代碼:

Program.cs(完整)

using System;
using Autofac;

namespace AutofacExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 步驟 1:創建 ContainerBuilder
            var builder = new ContainerBuilder();

            // 步驟 2:注冊組件
            builder.RegisterType<DatabaseConnection>().As<IDatabaseConnection>().SingleInstance();
            builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
            builder.RegisterType<Logger>().As<ILogger>().Named<ILogger>("ConsoleLogger");

            // 步驟 3:構建容器
            var container = builder.Build();

            // 步驟 4:解析組件并進行屬性注入
            using (var scope = container.BeginLifetimeScope())
            {
                var userRepository = scope.Resolve<IUserRepository>();
                userRepository.AddUser("John Doe");

                // 屬性注入示例
                var logger = scope.ResolveNamed<ILogger>("ConsoleLogger");
                logger.Log("This is a log message with attribute injection.");
            }

            // 步驟 7:使用另一個 ContainerBuilder 注冊另一個組件
            var builder2 = new ContainerBuilder();
            builder2.RegisterType<EmailSender>().As<IEmailSender>();

            // 步驟 8:合并 ContainerBuilder
            builder.Update(builder2);

            // 步驟 9:解析新組件
            using (var scope = container.BeginLifetimeScope())
            {
                var emailSender = scope.Resolve<IEmailSender>();
                emailSender.SendEmail("user@example.com", "Hello", "This is a test email.");
            }

            Console.WriteLine("Press Enter to exit...");
            Console.ReadLine();
        }
    }
}

這個示例演示了如何使用多個 ContainerBuilder 注冊不同的組件,并將它們合并到一個容器中。當程序運行時,它會輸出以下內容:

Connected to the database.
User 'John Doe' added to the database.
Logging: This is a log message with attribute injection.
Sending email to user@example.com with subject: Hello
Message: This is a test email.
Press Enter to exit...

這表明我們成功注冊和合并了不同的組件,并且它們可以一起工作。

Autofac 是一個強大的 .NET 依賴注入容器,它提供了多種注冊方式、屬性注入以及合并多個 ContainerBuilder 的功能,使你能夠更靈活地管理對象的生命周期和解決依賴關系。希望這個示例能夠幫助你更好地理解 Autofac 的使用方式,并在你的.NET 項目中更好地應用依賴注入。Autofac 的強大功能使它成為一個優秀的依賴注入容器,適用于各種應用場景。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-09-28 08:59:38

2020-07-03 08:21:57

Java集合框架

2024-04-10 08:22:44

2024-04-08 10:01:33

2020-08-03 10:00:11

前端登錄服務器

2023-04-24 08:00:00

ES集群容器

2025-01-02 00:00:00

2022-08-01 11:33:09

用戶分析標簽策略

2021-04-08 07:37:39

隊列數據結構算法

2019-08-13 15:36:57

限流算法令牌桶

2023-09-11 08:13:03

分布式跟蹤工具

2020-02-18 16:20:03

Redis ANSI C語言日志型

2020-05-14 16:35:21

Kubernetes網絡策略DNS

2023-02-10 09:04:27

2022-06-20 09:01:23

Git插件項目

2020-05-20 14:05:19

自動化測試框架軟件測試

2017-03-11 22:19:09

深度學習

2021-03-03 14:55:10

開發MySQL代碼

2020-03-09 17:28:51

NoSQLMongoDB數據庫

2023-09-04 08:00:00

開發Java線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 国产在线视频一区二区董小宛性色 | 亚洲免费精品一区 | 亚洲狠狠丁香婷婷综合久久久 | h视频免费看 | 7777奇米影视 | 国产一区二区三区四区三区四 | 国产在线二区 | 久久国产亚洲 | 日日天天 | av网址在线| 福利视频网 | 精品综合 | 精品国产乱码一区二区三区a | 99久久精品国产一区二区三区 | 婷婷一级片 | 国产精品毛片久久久久久 | 中文字幕在线中文 | 国产精品自产拍 | 亚洲狠狠爱一区二区三区 | 日韩av美女电影 | 99久久99| 亚洲精品电影网在线观看 | 正在播放国产精品 | 久久成人免费视频 | 午夜精品在线观看 | 国产欧美精品一区二区三区 | 国产精品久久毛片av大全日韩 | 天天干天天草 | 欧美精品乱码99久久影院 | 国产99久久精品一区二区永久免费 | 免费在线观看成人 | 亚洲免费在线观看 | 国产精品视频偷伦精品视频 | 国产精品乱码一区二区三区 | 国产精品高潮呻吟久久aⅴ码 | 欧美一级黄色网 | 成人免费在线播放 | 久久亚洲国产精品日日av夜夜 | 精品视频一区二区三区在线观看 | 欧美 日韩 亚洲91麻豆精品 |