国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

.net中優(yōu)秀依賴注入框架Autofac看一篇就夠了

這篇具有很好參考價(jià)值的文章主要介紹了.net中優(yōu)秀依賴注入框架Autofac看一篇就夠了。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

.net中優(yōu)秀依賴注入框架Autofac看一篇就夠了

?

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

1. 安裝 Autofac

首先,確保你已經(jīng)安裝了 Autofac NuGet 包。你可以使用 NuGet 包管理器或通過控制臺(tái)運(yùn)行以下命令來安裝 Autofac:

Install-Package Autofac

2. 創(chuàng)建一個(gè)簡單的控制臺(tái)應(yīng)用程序

我們將從一個(gè)簡單的控制臺(tái)應(yīng)用程序開始,以演示 Autofac 的基本用法。我們將創(chuàng)建一個(gè)包含多個(gè)組件的容器,并演示多種注冊(cè)方式以及屬性注入的方法。

Program.cs

using System;
using Autofac;

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

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

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

            // 步驟 4:解析組件并進(jìn)行屬性注入
            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. 創(chuàng)建組件和接口

現(xiàn)在,我們將創(chuàng)建三個(gè)組件?DatabaseConnection,UserRepository?和?Logger,以及它們所實(shí)現(xiàn)的接口。

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. 多種注冊(cè)方式

Autofac 提供了多種不同的組件注冊(cè)方式,允許你控制組件的生命周期、解決復(fù)雜的依賴關(guān)系和應(yīng)用更高級(jí)的用法。以下是一些常見的注冊(cè)方式:

4.1. 單例注冊(cè)

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

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

4.2. 生命周期范圍注冊(cè)

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

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

4.3. 命名注冊(cè)

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

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

4.4. Lambda 表達(dá)式注冊(cè)

你可以使用 Lambda 表達(dá)式注冊(cè)一個(gè)組件,以根據(jù)需要?jiǎng)?chuàng)建實(shí)例。在示例中,我們使用 Lambda 表達(dá)式注冊(cè)?DatabaseConnection。

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

4.5. 泛型組件注冊(cè)

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

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

5. 屬性注入

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

首先,我們需要為?UserRepository?類添加一個(gè)屬性,并使用?[Autowired]?特性進(jìn)行標(biāo)記:

public class UserRepository : IUserRepository
{
    private readonly IDatabaseConnection _databaseConnection;

    // 使用 [Autowired] 特性進(jìn)行屬性注入
    [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.");
    }
}

接下來,我們需要在容器構(gòu)建前啟用屬性注入。這可以通過配置?ContainerBuilder?來實(shí)現(xiàn):

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

現(xiàn)在,當(dāng)?UserRepository?被解析時(shí),Logger?屬性將自動(dòng)注入,從而實(shí)現(xiàn)屬性注入。

6. 使用多個(gè)ContainerBuilder合并注冊(cè)

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

Program.cs(擴(kuò)展)

在上面的示例中,我們已經(jīng)創(chuàng)建了一個(gè)容器并注冊(cè)了組件?,F(xiàn)在,我們將添加一個(gè)額外的?ContainerBuilder,注冊(cè)另一個(gè)組件,然后將它們合并。

// 步驟 7:使用另一個(gè) ContainerBuilder 注冊(cè)另一個(gè)組件
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}");
    }
}

現(xiàn)在,我們已經(jīng)注冊(cè)了一個(gè)名為?EmailSender?的額外組件,并將其合并到主容器中。

7. 使用多個(gè) ContainerBuilder 示例

這是完整的示例代碼:

Program.cs(完整)

using System;
using Autofac;

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

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

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

            // 步驟 4:解析組件并進(jìn)行屬性注入
            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:使用另一個(gè) ContainerBuilder 注冊(cè)另一個(gè)組件
            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();
        }
    }
}

這個(gè)示例演示了如何使用多個(gè)?ContainerBuilder?注冊(cè)不同的組件,并將它們合并到一個(gè)容器中。當(dāng)程序運(yùn)行時(shí),它會(huì)輸出以下內(nèi)容:

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...

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

Autofac 是一個(gè)強(qiáng)大的 .NET 依賴注入容器,它提供了多種注冊(cè)方式、屬性注入以及合并多個(gè)?ContainerBuilder?的功能,使你能夠更靈活地管理對(duì)象的生命周期和解決依賴關(guān)系。希望這個(gè)示例能夠幫助你更好地理解 Autofac 的使用方式,并在你的.NET 項(xiàng)目中更好地應(yīng)用依賴注入。Autofac 的強(qiáng)大功能使它成為一個(gè)優(yōu)秀的依賴注入容器,適用于各種應(yīng)用場(chǎng)景。

?

.net中優(yōu)秀依賴注入框架Autofac看一篇就夠了文章來源地址http://www.zghlxwxcb.cn/news/detail-747936.html

到了這里,關(guān)于.net中優(yōu)秀依賴注入框架Autofac看一篇就夠了的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • .net下優(yōu)秀的IOC容器框架Autofac的使用方法,實(shí)例解析

    .net下優(yōu)秀的IOC容器框架Autofac的使用方法,實(shí)例解析

    Autofac是一個(gè)功能強(qiáng)大的依賴注入容器,它提供了一種簡單和靈活的方式來管理對(duì)象之間的依賴關(guān)系。下面是Autofac的一些優(yōu)點(diǎn): 簡單易用:Autofac提供了一種直觀和簡潔的方式來注冊(cè)和解析依賴項(xiàng)。它的API設(shè)計(jì)得非常易于理解和使用,使得開發(fā)人員可以輕松地配置和管理依賴關(guān)

    2024年02月05日
    瀏覽(23)
  • 安卓的常用布局看一篇就夠了

    安卓的常用布局看一篇就夠了

    目錄 1-1? 布局通用的屬性 1-2? ?線性布局(LinearLayout) 1、常見屬性: 2、線性布局的例子: ?1-3? 相對(duì)布局(RelativeLayout) 1、常見屬性: 2、 相對(duì)布局的例子: ?1-4? 幀布局(FrameLayout) 1.常用屬性 2、幀布局例子: 1-5 表格布局(TableLayout) 1、常見屬性: 2、表格布局例子

    2024年02月07日
    瀏覽(17)
  • 超詳細(xì)||YOLOv8基礎(chǔ)教程(環(huán)境搭建,訓(xùn)練,測(cè)試,部署看一篇就夠)(在推理視頻中添加FPS信息)

    超詳細(xì)||YOLOv8基礎(chǔ)教程(環(huán)境搭建,訓(xùn)練,測(cè)試,部署看一篇就夠)(在推理視頻中添加FPS信息)

    這篇文章將跳過基礎(chǔ)的深度學(xué)習(xí)環(huán)境的搭建,如果沒有完成的可以看我的這篇博客:超詳細(xì)||深度學(xué)習(xí)環(huán)境搭建記錄cuda+anaconda+pytorch+pycharm-CSDN博客 1. 在github上下載源碼: GitHub - ultralytics/ultralytics: NEW - YOLOv8 ?? in PyTorch ONNX OpenVINO CoreML TFLite 2. 安裝ultralytics(YOLOv8改名為ultraly

    2024年02月05日
    瀏覽(19)
  • 【.NET6+WPF】WPF使用prism框架+Unity IOC容器實(shí)現(xiàn)MVVM雙向綁定和依賴注入

    【.NET6+WPF】WPF使用prism框架+Unity IOC容器實(shí)現(xiàn)MVVM雙向綁定和依賴注入

    前言:在C/S架構(gòu)上,WPF無疑已經(jīng)是“桌面一霸”了。在.NET生態(tài)環(huán)境中,很多小伙伴還在使用Winform開發(fā)C/S架構(gòu)的桌面應(yīng)用。但是WPF也有很多年的歷史了,并且基于MVVM的開發(fā)模式,受到了很多開發(fā)者的喜愛。 并且隨著工業(yè)化的進(jìn)展,以及幾年前微軟對(duì).NET平臺(tái)的開源,國內(nèi)大多

    2024年02月06日
    瀏覽(28)
  • flask模板注入(ssti),一篇就夠了

    flask模板注入(ssti),一篇就夠了

    1.什么是flask? ? flask是用python編寫的一個(gè)輕量web開發(fā)框架 2.ssti成因 flask使用jinjia2渲染引擎進(jìn)行網(wǎng)頁渲染,當(dāng)處理不得當(dāng),未進(jìn)行語句過濾,用戶輸入{{控制語句}},會(huì)導(dǎo)致渲染出惡意代碼,形成注入 本地演示(需要自行安裝flask,requests模塊) 通過輸入?yún)?shù)key可以進(jìn)行簡單的渲

    2024年02月07日
    瀏覽(27)
  • JavaWeb搭建| Tomcat配置| Maven依賴|這一篇就夠了(超詳細(xì))

    JavaWeb搭建| Tomcat配置| Maven依賴|這一篇就夠了(超詳細(xì))

    ??作者簡介:練習(xí)時(shí)長兩年半的Java up主 ??個(gè)人主頁:老茶icon ?? ps:點(diǎn)贊??是免費(fèi)的,卻可以讓寫博客的作者開興好久好久?? ??系列專欄:Java全棧,計(jì)算機(jī)系列(火速更新中) ?? 格言:種一棵樹最好的時(shí)間是十年前,其次是現(xiàn)在 ??動(dòng)動(dòng)小手,點(diǎn)個(gè)關(guān)注不迷路,感謝寶

    2024年02月01日
    瀏覽(26)
  • 【ASP.NET Core 基礎(chǔ)知識(shí)】--依賴注入(DI)--什么是依賴注入

    依賴注入(Dependency Injection,簡稱DI)是一種設(shè)計(jì)模式,用于解耦和管理類之間的依賴關(guān)系。它的核心思想是將原本需要在代碼中顯式創(chuàng)建的依賴關(guān)系,交給外部容器進(jìn)行控制和管理。 具體來說,依賴注入的實(shí)現(xiàn)方式是通過將依賴對(duì)象的創(chuàng)建和維護(hù)責(zé)任轉(zhuǎn)移到外部容器中,使

    2024年01月23日
    瀏覽(90)
  • .NET Core 依賴注入

    在.NET Core中,依賴注入(Dependency Injection,簡稱DI)是框架的一個(gè)重要特性,可以幫助我們解耦代碼、管理對(duì)象生命周期以及提高可測(cè)試性等.一下是.NET Core中依賴注入的一些基本概念和用法: 1、服務(wù)(Service):在DI中,服務(wù)即一個(gè)對(duì)象或者類型。用于完成特定的功能.例如,數(shù)據(jù)庫訪

    2023年04月24日
    瀏覽(94)
  • 【2023最新版】超詳細(xì)Sqlmap安裝保姆級(jí)教程,SQL注入使用指南,收藏這一篇就夠了

    【2023最新版】超詳細(xì)Sqlmap安裝保姆級(jí)教程,SQL注入使用指南,收藏這一篇就夠了

    一、sqlmap簡介 sqlmap是一個(gè)自動(dòng)化的SQL注入工具,其主要功能是掃描,發(fā)現(xiàn)并利用給定的URL進(jìn)行SQL注入。目前支持的數(shù)據(jù)庫有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等 Sqlmap采用了以下5種獨(dú)特的SQL注入技術(shù) 基于布爾類型的盲注,即可以根據(jù)

    2024年02月10日
    瀏覽(27)
  • .NET使用依賴注入,控制反轉(zhuǎn)

    .NET 支持依賴項(xiàng)注入 (DI) 軟件設(shè)計(jì)模式,這是一種在類及其依賴項(xiàng)之間實(shí)現(xiàn) 控制 (IoC) 的反轉(zhuǎn) 的技術(shù) 避免有狀態(tài)的、靜態(tài)類和成員。 通過將應(yīng)用設(shè)計(jì)為改用單一實(shí)例服務(wù),避免創(chuàng)建全局狀態(tài)。 避免在服務(wù)中直接實(shí)例化依賴類。 直接實(shí)例化會(huì)將代碼耦合到特定實(shí)現(xiàn)。 不在服務(wù)

    2023年04月16日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包