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

如何在.net6webapi中實現(xiàn)自動依賴注入

這篇具有很好參考價值的文章主要介紹了如何在.net6webapi中實現(xiàn)自動依賴注入。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

IOC/DI

IOC(Inversion of Control)控制反轉(zhuǎn):控制反正是一種設(shè)計思想,旨在將程序中的控制權(quán)從程序員轉(zhuǎn)移到了容器中。容器負(fù)責(zé)管理對象之間的依賴關(guān)系,使得對象不再直接依賴于其他對象,而是通過依賴注入的方式來獲取所需的資源。

DI(Dependency Injection)依賴注入:他是IOC的具體實現(xiàn)方式之一,使用最為廣泛,DI通過在運行時動態(tài)地將某個依賴關(guān)系抽象為獨立的組件,提交到容器之中,需要使用時再由容器注入,提升組件重用的頻率,為系統(tǒng)搭建一個靈活,可擴(kuò)展的平臺。

IOC/DI是一種設(shè)計模式,用于解耦組件之間的依賴關(guān)系。在傳統(tǒng)的編程模式中,組件之間的依賴關(guān)系是硬編碼在代碼中的,這樣會導(dǎo)致代碼的耦合度很高,難以維護(hù)和發(fā)展。而IOC/DI模式則是通過將組件之間的依賴關(guān)系交給容器來管理,組件不再直接依賴其他組件,而是通過容器來獲取所依賴的對象。這樣可以使組件之間的依賴關(guān)系更加靈活,容器可以根據(jù)需要動態(tài)地創(chuàng)建和管理組件,從而實現(xiàn)更好的可維護(hù)性和可擴(kuò)展性。

如何在.net6webapi中使用依賴注入?

首先我們定義一個服務(wù)接口及對應(yīng)的實現(xiàn)

    public interface ITestServices
    {
        int return123();
    }
    public class TestServices : ITestServices
    {
        public int return123()
        {
            return 123;
        }
    }

然后我們在Program.cs注入服務(wù)實現(xiàn)

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddTransient<ITestServices, TestServices>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

值得注意的是依賴注入有三種生命周期

  • 作用域(Scoped):在應(yīng)用程序啟動時創(chuàng)建,并在應(yīng)用程序關(guān)閉時銷毀。這種類型的服務(wù)實例會被容器管理,但是只會被當(dāng)前請求使用。當(dāng)請求結(jié)束時,該服務(wù)實例會被銷毀。
  • 單例(Singleton):在應(yīng)用程序啟動時創(chuàng)建,并在整個應(yīng)用程序運行期間保持不變。這種類型的服務(wù)實例會被容器管理,并且可以被多個請求共享。
  • 瞬時(Transient):在應(yīng)用程序啟動時創(chuàng)建,并在應(yīng)用程序關(guān)閉時銷毀。這種類型的服務(wù)實例不會被容器管理,也不會被其他服務(wù)引用。

最后在需要使用的控制器中構(gòu)造函數(shù)注入就可以使用了

    [Route("[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        private readonly ITestServices _testServices;
        public TestController(ITestServices testServices)
        {
            _testServices= testServices;
        }

        [HttpGet]
        public int Get123() => _testServices.return123();
    }

如何在.net6webapi中實現(xiàn)自動依賴注入

?怎么實現(xiàn)自動注入?

依賴注入好歸好,就是每個服務(wù)都得在Program.cs注入服務(wù)實現(xiàn),一但服務(wù)多起來,麻煩不說,Program.cs中的代碼更是會變得凌亂不堪,可能會有小伙伴說,可以開一個擴(kuò)展函數(shù)單獨做注入,但私以為,既然有一種方法可以一勞永逸,何樂而不為呢?

其實現(xiàn)便是利用.net的高級特性之一,反射

首先我們定義三個生命周期接口,其對應(yīng)依賴注入的三種生命周期

    //瞬時注入服務(wù)接口
    public interface ITransient
    { }

    //作用域注入服務(wù)接口
    public interface IScoped
    { }

    //單例注入服務(wù)接口
    public interface ISingleton
    { }

然后我們定義自動注入的擴(kuò)展方法,其為核心實現(xiàn)

        public static IServiceCollection RegisterAllServices(this IServiceCollection services)
        {
            //獲取當(dāng)前程序集
            var entryAssembly = Assembly.GetEntryAssembly();

            //獲取所有類型
            //!. null包容運算符,當(dāng)你明確知道表達(dá)式的值不為null 使用!.(即null包容運算符)可以告知編譯器這是預(yù)期行為,不應(yīng)發(fā)出警告
            //例: entryAssembly!.GetReferencedAssemblies() 正常
            //entryAssembly.GetReferencedAssemblies() 編譯器判斷entryAssembly有可能為null,變量下方出現(xiàn)綠色波浪線警告

            var types = entryAssembly!.GetReferencedAssemblies()//獲取當(dāng)前程序集所引用的外部程序集
                .Select(Assembly.Load)//裝載
                .Concat(new List<Assembly>() { entryAssembly })//與本程序集合并
                .SelectMany(x => x.GetTypes())//獲取所有類
                .Distinct();//排重

            //三種生命周期分別注冊
            Register<ITransient>(types, services.AddTransient, services.AddTransient);
            Register<IScoped>(types, services.AddScoped, services.AddScoped);
            Register<ISingleton>(types, services.AddSingleton, services.AddSingleton);

            return services;
        }

        /// <summary>
        /// 根據(jù)服務(wù)標(biāo)記的生命周期interface,不同生命周期注冊到容器里面
        /// </summary>
        /// <typeparam name="TLifetime">注冊的生命周期</typeparam>
        /// <param name="types">集合類型</param>
        /// <param name="register">委托:成對注冊</param>
        /// <param name="registerDirectly">委托:直接注冊服務(wù)實現(xiàn)</param>
        private static void Register<TLifetime>(IEnumerable<Type> types, Func<Type, Type, IServiceCollection> register, Func<Type, IServiceCollection> registerDirectly)
        {
            //找到所有標(biāo)記了Tlifetime生命周期接口的實現(xiàn)類
            var tImplements = types.Where(x => x.IsClass && !x.IsAbstract && x.GetInterfaces().Any(tinterface => tinterface == typeof(TLifetime)));

            //遍歷,挨個以其他所有接口為key,當(dāng)前實現(xiàn)為value注冊到容器中
            foreach (var t in tImplements)
            {
                //獲取除生命周期接口外的所有其他接口
                var interfaces = t.GetInterfaces().Where(x => x != typeof(TLifetime));
                if (interfaces.Any())
                {
                    foreach (var i in interfaces)
                    {
                        register(i, t);
                    }
                }

                //有時需要直接注入實現(xiàn)類本身
                registerDirectly(t);
            }
        }

其核心邏輯便是通過反射掃描程序集,當(dāng)掃描到實現(xiàn)了我們定義的生命周期接口時,為其實現(xiàn)對應(yīng)的生命周期注入。

注冊這個服務(wù)

builder.Services.RegisterAllServices();

然后我們就可以通過繼承生命周期接口來實現(xiàn)自動服務(wù)注入

    public interface ITestServices
    {
        int return123();
    }
    public class TestServices : ITestServices, ITransient
    {
        public int return123()
        {
            return 123;
        }
    }

接下來無需在Program.cs注入服務(wù)實現(xiàn)

如何在.net6webapi中實現(xiàn)自動依賴注入

?調(diào)用成功。

自動注入代碼參考自:【NetCore】依賴注入的一些理解與分享 - wosperry - 博客園 (cnblogs.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-475828.html

到了這里,關(guān)于如何在.net6webapi中實現(xiàn)自動依賴注入的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • .Net6 使用Autofac進(jìn)行依賴注入

    剛接觸.net 6,記錄一下在.net6上是怎么使用Autofac進(jìn)行動態(tài)的依賴注入的 1、新建一個webapi項目,框架選擇net 6 2、引用Nuget包---Autofac.Extensions.Dependency 3、在Program.cs上添加如下代碼 4. 或 以及再startup.cs中添加ConfigureContainer方法 ? ?public void ConfigureContainer(ContainerBuilder builder) ? ?

    2024年04月11日
    瀏覽(18)
  • .Net6.0系列-7 依賴注入(一)

    依賴注入(Dependency Injection,DI)是控制反轉(zhuǎn)(Inversion of Control,IOC)思想的實現(xiàn)方式,依賴注入簡化模塊的組裝過程,降低模塊之間的耦合度. DI的幾個概念: 服務(wù)(Service):和框架請求之后返回的一個對象,可以是一個數(shù)據(jù)庫鏈接,也可以是一個文件處理的方法,或者是數(shù)據(jù)處理的一個過程方法

    2023年04月11日
    瀏覽(20)
  • net6 winform使用依賴注入(IOC)

    net6 winform使用依賴注入(IOC)

    依賴注入(DI)是一種設(shè)計模式,它可以消除編程代碼之間的依賴性,因此可以很容易地管理和測試應(yīng)用程序。它有三種類型分別為構(gòu)造函數(shù)注入,屬性注入以及方法注入。它具有減少依賴性增強(qiáng)組件的可重用性等好處。 通俗的來說我們不通過 new 的方式在類內(nèi)部創(chuàng)建依賴類

    2024年02月05日
    瀏覽(19)
  • ASP.NET WebApi 極簡依賴注入

    ASP.NET WebApi 極簡依賴注入

    .NET Core 7.0 ASP.NET Core Visual Studio 2022 .Net Core WebApi Redis消息訂閱 ASP.NET Core 依賴注入最佳實踐 簡單來說就是 有效地設(shè)計服務(wù)及其依賴關(guān)系。 防止多線程問題。 防止內(nèi)存泄漏。 防止?jié)撛诘腻e誤。

    2024年02月08日
    瀏覽(94)
  • .Net6 Web Core API 配置 Autofac 封裝 --- 依賴注入

    .Net6 Web Core API 配置 Autofac 封裝 --- 依賴注入

    目錄 一、NuGet 包導(dǎo)入 二、Autofac 封裝類 三、Autofac 使用 四、案例測試 下列封裝 采取 程序集注入方法 , 單個依賴注入, 也適用, 可依賴注入的地方配置 Autofac Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy ? ?

    2024年02月14日
    瀏覽(96)
  • “warning NU1701: 項目依賴包與項目框架net6.0不完全兼容“

    一個Net6的Web項目,有一個警告: 在項目文件里,這樣 在nuget包管理器界面,看到 Microsoft.AspNet.WebApi.Core 的信息,其依賴于 Microsoft.AspNet.WebApi.Client ,且其也滿足 。NetStandard V2。0 的,但看這個 Client ,其又依賴于NewtonnSoft.Json的舊版本,從而導(dǎo)致依賴鏈最終到了 NetFramework4.* 的

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

    【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(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)展,以及幾年前微軟對.NET平臺的開源,國內(nèi)大多

    2024年02月06日
    瀏覽(27)
  • Asp.net core Webapi 如何執(zhí)行定時任務(wù)?

    Asp.net core Webapi 如何執(zhí)行定時任務(wù)?

    在計算機(jī)系統(tǒng)中,定時執(zhí)行一些后臺任務(wù)是很常見的場景,比如定時發(fā)送郵件、備份數(shù)據(jù)等等。 那么,.NET 技術(shù)如何通過編程靈活地實現(xiàn)項目里復(fù)雜的自定義任務(wù)呢? 如果是 Windows 生態(tài),通常來說,可以有這些方式: 編寫一個程序,通過 Windows 內(nèi)置的任務(wù)計劃來定時執(zhí)行。

    2024年02月04日
    瀏覽(90)
  • 如何在 .NET Core WebApi 中處理 MultipartFormDataContent

    如何在 .NET Core WebApi 中處理 MultipartFormDataContent

    最近在對某個后端服務(wù)做 .NET Core 升級時,里面使用了多處處理 MultipartFormDataContent 相關(guān)內(nèi)容的代碼。這些地方從 .NET Framework 遷移到 .NET Core 之后的代碼改動較大,由于本身沒有測試覆蓋,導(dǎo)致在部署 QA 環(huán)境后引發(fā)了一些問題。這里做一個技術(shù)復(fù)盤。 我們在做后端接口開發(fā)的

    2023年04月19日
    瀏覽(26)
  • asp.net core webapi如何執(zhí)行周期性任務(wù)

    asp.net core webapi如何執(zhí)行周期性任務(wù)

    新建asp.net core webapi項目,使用Nuget搜索安裝Quartz包。 注意:定時執(zhí)行時間格式,參考連接:https://www.cnblogs.com/wudequn/p/8506938.html 在IIS中找到這個站點所用的程序池,點擊“高級設(shè)置…” 在打開的列表中更改以下設(shè)置: 回收——固定時間間隔(分鐘) 改為 0 ——虛擬/專用內(nèi)存

    2024年02月13日
    瀏覽(104)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包