亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

.NET學(xué)習(xí)筆記之默認(rèn)依賴(lài)注入

 更新時(shí)間:2021年05月08日 11:04:37   作者:AZRNG  
這篇文章主要給大家介紹了關(guān)于.NET學(xué)習(xí)筆記之默認(rèn)依賴(lài)注入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

介紹

不要依賴(lài)于具體的實(shí)現(xiàn),應(yīng)該依賴(lài)于抽象,高層模塊不應(yīng)該依賴(lài)于底層模塊,二者應(yīng)該依賴(lài)于抽象。簡(jiǎn)單的說(shuō)就是為了更好的解耦。而控制反轉(zhuǎn)(Ioc)就是這樣的原則的其中一個(gè)實(shí)現(xiàn)思路, 這個(gè)思路的其中一種實(shí)現(xiàn)方式就是依賴(lài)注入(DI)。ASP.NET Core內(nèi)置有對(duì)依賴(lài)注入(DI)的支持,開(kāi)發(fā)者只需要定義好接口后,在Startup.cs的ConfigureServices方法里使用對(duì)應(yīng)生命周期的綁定方法即可。

只要是用new實(shí)例化的都是存在依賴(lài)的。

生命周期

AddSingleton→AddTransient→AddScoped

Singleton(單例)

服務(wù)在第一次請(qǐng)求時(shí)被創(chuàng)建(或者當(dāng)我們?cè)贑onfigureServices中指定創(chuàng)建某一實(shí)例并運(yùn)行方法),其后的每次請(qǐng)求將沿用已創(chuàng)建服務(wù)。如果開(kāi)發(fā)者的應(yīng)用需要單例服務(wù)情景,請(qǐng)?jiān)O(shè)計(jì)成允許服務(wù)容器來(lái)對(duì)服務(wù)生命周期進(jìn)行操作,而不是手動(dòng)實(shí)現(xiàn)單例設(shè)計(jì)模式然后由開(kāi)發(fā)者在自定義類(lèi)中進(jìn)行操作。

services.AddSingleton<IApplicationService,ApplicationService>

比如某些公共類(lèi)等

Scoped(作用域)

一次請(qǐng)求開(kāi)始到請(qǐng)求結(jié)束 ,這次請(qǐng)求中獲取的對(duì)象都是同一個(gè)

services.AddScoped<IApplicationService,ApplicationService>

如果該service在一個(gè)請(qǐng)求過(guò)程中多次被用到,并且可能共享其中的字段或者屬性,那么就使用scoped,例如httpcontext (感謝群里老哥的幫助)

Transient(瞬時(shí))

每一次獲取的對(duì)象都不是同一個(gè),它最好被用于輕量級(jí)無(wú)狀態(tài)服務(wù)(如我們的Repository和ApplicationService服務(wù))

services.AddTransient<IApplicationService,ApplicationService>

如果該service在一次請(qǐng)求中只使用一次,那么就注冊(cè)Transient就好了。

注入方式

    /// <summary>
    /// 用戶(hù)接口
    /// </summary>
    public interface IUserService
    {
        string GetName();
    }

    /// <summary>
    /// 用戶(hù)實(shí)現(xiàn)
    /// </summary>
    public class UserService : IUserService
    {
        public string GetName()
        {
            return "AZRNG";
        }
    }

需要在ConfigureServices方法進(jìn)行注入

構(gòu)造函數(shù)注入

服務(wù)作為構(gòu)造函數(shù)參數(shù)添加,并且運(yùn)行時(shí)從服務(wù)容器中解析服務(wù)。

        private readonly IUserService _userService;

        public UserController(IUserService userService)
        {
            _userService = userService;
        }

        [HttpGet]
        public ActionResult GetName()
        {
            return Ok(_userService.GetName());
        }
FromServices操作注入
        [HttpGet]
        public ActionResult GetName([FromServices] IUserService _userService)
        {
            return Ok(_userService.GetName());
        }

核心

在.NET Core中DI的核心分為兩個(gè)組件:IServiceCollection和 IServiceProvider。

  • IServiceCollection負(fù)責(zé)注冊(cè)
  • IServiceProvider負(fù)責(zé)提供實(shí)例
public void ConfigureServices(IServiceCollection services)
{
    //將服務(wù)生命期的范圍限定為單個(gè)請(qǐng)求的生命期
    services.AddTransient<IUserService, UserService>();
}

獲取服務(wù)

        private readonly IUserService _userService;
        public HomeController(IUserService userService)
        {
            _userService = userService;
        }

        public IActionResult Index()
        {
            var info = _userService.GetInfo();
            return View();
        }

IServiceProvider獲取

        private readonly IServiceProvider _service;
        public UserController(IServiceProvider service)
        {
            _service = service;
        }

        [HttpGet]
        public ActionResult GetName()
        {
            var _userService = (IUserService)_service.GetService(typeof(IUserService));
            return Ok(_userService.GetName());
        }

statrup中獲取服務(wù)

var provider = services.BuildServiceProvider();
var userserivce = provider.GetService<IUserService>();
//或
var userservice2 = provider.GetRequiredService<IUserService>();

總結(jié)

到此這篇關(guān)于.NET學(xué)習(xí)筆記之默認(rèn)依賴(lài)注入的文章就介紹到這了,更多相關(guān).NET默認(rèn)依賴(lài)注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論