亚洲农村老熟妇肥BBBB_无码人妻精品一区二区蜜桃色_精品亚洲AⅤ无码午夜在线观看_中文字幕熟妇人妻在线视频_囯产色无码精品视频免费

當前位置: 首頁 > 科技新聞 >

net core 依賴注入, autofac 簡單使用

時間:2020-04-11 15:56來源:網(wǎng)絡(luò)整理 瀏覽:
綜述ASP.NET Core 支持依賴注入, 也推薦使用依賴注入. 主要作用是用來降低代碼之間的耦合度. 什么是控制反轉(zhuǎn)?控制反轉(zhuǎn)(Inve
綜述

ASP.NET Core 支持依賴注入, 也推薦使用依賴注入. 主要作用是用來降低代碼之間的耦合度.

什么是控制反轉(zhuǎn)?

控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計原則,可以用來減低計算機代碼之間的耦合度。

其中最常見的方式叫做"依賴注入"(Dependency Injection,簡稱DI),還有一種方式叫"依賴查找"(Dependency Lookup)

什么是依賴注入?

這個概念分開來理解

1. 依賴, 當B類里要調(diào)用A類完成某個功能, 那么就可以說是B依賴于A.

    public class ClassA
{
public string FnA(string str)
{
return "A-" + str;
}
}

public class ClassB
{
ClassA ca = new ClassA();
public string FnB(string str)
{
var art = ca.FnA(str);
return "B-" + art;
}
}

上面這種方式是很常見的, 但是并不符合依賴的原則. 依賴的原則是: 依賴于抽象,而不是具體的實現(xiàn). 也就是B類不能直接依賴A類, 應(yīng)該依賴A的抽象接口.

2. 注入. 在這里C類不去實例化A類,而是通過其他人傳遞給我,我只用就好。簡單來說就是別人對依賴創(chuàng)建實例化,我自己只負責使用,這個過程可以理解為注入.

    public class ClassC
{
ClassA _ca;
public ClassC(ClassA ca)
{
_ca = ca;
}
public string FnC(string str)
{
var art = _ca.FnA(str);
return "C-" + art;
}
}

在上面的依賴中講過, 最好不要直接依賴實現(xiàn),應(yīng)該依賴抽象接口. 通過注入我們了解到, 我們不應(yīng)該直接實例化依賴項,而應(yīng)該別人創(chuàng)建, 我們只負責使用. 綜合一下, 我們就將原來的使用方式改為以下方式

    /// <summary>
/// 抽象接口A
/// </summary>
public interface InterfaceA
{
string FnA(string str);
}

/// <summary>
/// 抽象接口A的具體實現(xiàn)
/// </summary>
public class ClassA:InterfaceA
{
public string FnA(string str)
{
return "A-" + str;
}
}

/// <summary>
/// 傳統(tǒng)方式
/// </summary>
public class ClassB
{
ClassA ca = new ClassA();
public string FnB(string str)
{
var art = ca.FnA(str);
return "B-" + art;
}
}
/// <summary>
/// 依賴注入方式, 1.依賴于抽象接口,而不是具體實現(xiàn); 2.依賴項不由我們自己創(chuàng)建,而只是負責使用
/// </summary>
public class ClassD
{
readonly InterfaceA _ica;
public ClassD(InterfaceA ica)
{
_ica = ica;
}
public string FnD(string str)
{
var art = _ica.FnA(str);
return "D-" + art;
}
}

ClassB就是我們常見的使用方式, ClassD就是我們使用依賴注入的使用方式.

如何在.net core 里使用依賴注入?

1. 創(chuàng)建抽象接口(過程略)

2. 實現(xiàn)抽象接口(過程略)

3. 在Startup類的ConfigureServices方法中注冊服務(wù)

       public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddTransient<InterfaceA, ClassA>();
}

4. 在Controller中使用, 通過在構(gòu)造函數(shù)中獲取實例, 然后使用

    [ApiController]
[Route("[controller]/[action]")]
public class DemoController : ControllerBase
{
private readonly InterfaceA _interfaceA;
/// <summary>
/// 通過構(gòu)造函數(shù)獲取實例
/// </summary>
/// <param name="interfaceA"></param>
public DemoController(InterfaceA interfaceA)
{
_interfaceA = interfaceA;
}
public IActionResult TestGet()
{
var rt = _interfaceA.FnA("uuu");
return Ok(rt);
}
}

結(jié)果

net core 依賴注入, autofac 簡單使用

以上就是一個簡單的.net core 使用依賴注入的例子

如何選擇服務(wù)的生命周期?

在上面的第三步, 在注冊服務(wù)的時候我們使用的AddTransient , 除此之外還有 AddScoped,AddSingleton

AddTransient 暫時暫時生存期服務(wù) (AddTransient) 是每次從服務(wù)容器進行請求時創(chuàng)建的。 這種生存期適合輕量級、 無狀態(tài)的服務(wù)。

AddScoped 范圍內(nèi)作用域生存期服務(wù) (AddScoped) 以每個客戶端請求(連接)一次的方式創(chuàng)建。注意:在中間件內(nèi)使用有作用域的服務(wù)時,請將該服務(wù)注入至 Invoke 或 InvokeAsync 方法。 請不要通過構(gòu)造函數(shù)注入進行注入,因為它會強制服務(wù)的行為與單一實例類似。 有關(guān)詳細信息,請參閱 寫入自定義 ASP.NET Core 中間件。

net core 依賴注入, autofac 簡單使用


AddSingleton 單例單一實例生存期服務(wù) (AddSingleton) 是在第一次請求時(或者在運行 Startup.ConfigureServices 并且使用服務(wù)注冊指定實例時)創(chuàng)建的。 每個后續(xù)請求都使用相同的實例。 如果應(yīng)用需要單一實例行為,建議允許服務(wù)容器管理服務(wù)的生存期。 不要實現(xiàn)單一實例設(shè)計模式并提供用戶代碼來管理對象在類中的生存期。注意:從單一實例解析有作用域的服務(wù)很危險。 當處理后續(xù)請求時,它可能會導致服務(wù)處于不正確的狀態(tài)。

什么是容器?

講到這里可能大家會有個疑問.

依賴注入把依賴的創(chuàng)建交給了別人, 我們只負責使用, 那么這個誰創(chuàng)建, 在哪兒創(chuàng)建, 怎么管理?

這個就引發(fā)了一個新的概念--容器. 容器就是負責關(guān)系的系統(tǒng)所有的依賴. 在我們.net core 有一個默認的容器, 專門用于管理這些依賴.

net core 依賴注入, autofac 簡單使用

但是默認的容器在小型項目的時候夠了,但是大型項目就不夠了.

我們通過AddTransient這些方式去注冊服務(wù), 那么一個項目有非常的這種服務(wù), 每一個都注冊,在startup這個里面就變非常臃腫負責. 這個時候我們需要替換原來的容器.

如何更換默認容器?

在這里我們介紹一種常用的第三方容器: AutoFac, .net core 版本使用的是3.1 其他版本會略有不同.

一. nuget安裝 Autofac.Extensions.DependencyInjectionnet core 依賴注入, autofac 簡單使用

二. 修改 Program.cs 文件

添加一句

.UseServiceProviderFactory(new Autofac.Extensions.DependencyInjection.AutofacServiceProviderFactory())//Autofac

net core 依賴注入, autofac 簡單使用

三. 修改 Startup.cs

新增ConfigureContainer方法

        public void ConfigureContainer(ContainerBuilder builder)
{
// 方式一 默認注冊
builder.RegisterType<ClassA>().As<InterfaceA>();//注冊 類似默認容器的services.AddTransient<InterfaceA, ClassA>();
}

上面這種方式是默認的注冊, 類似.net core 自帶的注冊. 但是并不合適我們批量注冊, 下面介紹一種掃描程序集的注冊方式

        public void ConfigureContainer(ContainerBuilder builder)
{
//方式二 掃描程序集, RegisterAssemblyTypes接收包含一個或多個程序集的數(shù)組作為參數(shù). 默認地, 程序中所有具體的類都將被注冊.
var asm = Assembly.Load("Service");//指定dll名稱的程序集集
var defulatAsm = Assembly.GetExecutingAssembly();//默認執(zhí)行的dll
builder.RegisterAssemblyTypes(asm, defulatAsm)
.PublicOnly()//僅注冊public的方法
.Except<Service.DemoService>()//排除某個類
.Where(t => t.Name.EndsWith("Service") || t.Name == "ClassA")//可以在這里寫一些過濾類名規(guī)則
.AsImplementedInterfaces();
}
net core 依賴注入, autofac 簡單使用

在controller里使用的方式和以前一樣

參考文獻

.net core 依賴注入

Autofac 入門

最后

多說一句,很多人學Python過程中會遇到各種煩惱問題,沒有人解答容易放棄。小編是一名python開發(fā)工程師,這里有我自己整理了一套最新的python系統(tǒng)學習教程,包括從基礎(chǔ)的python腳本到web開發(fā)、爬蟲、數(shù)據(jù)分析、數(shù)據(jù)可視化、機器學習等。想要這些資料的可以關(guān)注小編,并在后臺私信小編:“01”即可領(lǐng)取。

推薦內(nèi)容