Dependency injection
IOC(控制反轉(zhuǎn))是啥? 借助第三方來(lái)實(shí)現(xiàn)依賴關(guān)系之間的解耦
在原來(lái)A對(duì)象獲取B對(duì)象時(shí),由主動(dòng)獲取一個(gè)B對(duì)象,變?yōu)榱薸oc主動(dòng)創(chuàng)建一個(gè)B對(duì)象給予A。造成了A對(duì)象由主動(dòng)行為變?yōu)榱吮粍?dòng)行為,則稱(chēng)為控制反轉(zhuǎn)。(A在獲得依賴對(duì)象的過(guò)程被反轉(zhuǎn)了)
DI(依賴注入)又是啥?
在IOC運(yùn)行期間,動(dòng)態(tài)的將某種依賴關(guān)系注入到對(duì)象中。
IOC 和 DI 都是描述的同一件事情,只是通過(guò)了不同的角度來(lái)看待這個(gè)過(guò)程。
在ASP.NET CORE中提供了DI容器
自帶的DI容器中提供了三種方法,分別是三種不同的生命周期
1、Transient每次調(diào)用都是不同的實(shí)例,比如常用的Microsoft.Extensions.Options.IConfigureOptions<T>;
2、Scoped每次請(qǐng)求是同一個(gè)實(shí)例,如 Entity Framework contexts;
3、Singleton只有一個(gè)實(shí)例,如Microsoft.Extensions.Logging.ILogger<T>;
具體使用哪種,要根據(jù)具體情況而定;
1、比如我們一般的業(yè)務(wù)邏輯都是Transient,這個(gè)也是比較常用的;
2、Scoped相對(duì)用的比較少,當(dāng)然也有很多業(yè)務(wù)邏輯也有用Scoped的;當(dāng)然他的妙用肯定是每次請(qǐng)求一個(gè)實(shí)例,比如我們?cè)谙到y(tǒng)中獲取登錄系統(tǒng)用戶的Id,這時(shí)就可以用Scoped,不管在Service層或者Repository層等等,獲取的都是同一個(gè)用戶;
3、Singleton很多都是系統(tǒng)級(jí)別設(shè)計(jì)用單利,比如日志;
使用方式
class Startup
//在Startup類(lèi)的ConfigureServices方法中設(shè)置注入
public void ConfigureServices (IServiceCollection services) {
services.AddTransient<IService, Service> ();
}
//使用構(gòu)造函數(shù)的方式獲取實(shí)例
public class ServiceController : Controller {
private readonly IService _service;
public ServiceController ( IService service) {
_service= service;
}
此外還可以用其他的容器來(lái)替換自帶的DI容器 如:Autofac