欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

ASP.NETCore中如何采用Autofac來(lái)替換IOC容器并實(shí)現(xiàn)屬性注入

今天就跟大家聊聊有關(guān)ASP.NET Core中如何采用Autofac來(lái)替換IOC容器并實(shí)現(xiàn)屬性注入,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

10余年的梁園網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整梁園建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“梁園網(wǎng)站設(shè)計(jì)”,“梁園網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

今天我們主要講講如何采用Autofac來(lái)替換IOC容器,并實(shí)現(xiàn)屬性注入

1.將默認(rèn)的IOC容器替換為Autofac

 首先,我們需要從nuget引用相關(guān)的包.

Autofac

Autofac.Extensions.DependencyInjection(這個(gè)包擴(kuò)展了一些微軟提供服務(wù)的類.來(lái)方便替換autofac)

然后,我們修改Startup中的ConfigureServices代碼如下:

public IServiceProvider ConfigureServices(IServiceCollection services)

        {

            services.AddMvc();

            services.AddDbContext<BloggingContext>();

            services.AddDirectoryBrowser();

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterModule<DefaultModule>();

            containerBuilder.Populate(services);

            var container = containerBuilder.Build();

            return new AutofacServiceProvider(container);

        }

這里我們使用了AutoFac的功能之一,模塊化注入.也就是RegisterModule 這里, DefaultModule是我們的注入模塊,代碼很簡(jiǎn)單,如下:

public class DefaultModule : Module

    {

        protected override void Load(ContainerBuilder builder)

        {

            //注入測(cè)試服務(wù)

            builder.RegisterType<TestService>().As<ITestService>();

        }

    }

解釋一下,在上面的代碼中,我們配置IServiceProvider從Autofac容器中解析(設(shè)置一個(gè)有效的Autofac服務(wù)適配器)。

然后在整個(gè)框架中使用它來(lái)解析控制器的依賴關(guān)系,并在HttpContext上公開(kāi)所有其他用例的服務(wù)定位。

這樣我們就完成了初步的Autofac容器替換.下面我們創(chuàng)建控制器來(lái)看看效果.代碼如下:

public class AutoDIController : Controller

    {

        private readonly ITestService _testService;

        public AutoDIController(ITestService testService)

        {

            _testService = testService;

        }

        // GET: AutoDI

        public ActionResult Index()

        {

            ViewBag.date = _testService.GetList("Name");

            return View();

        }

}

當(dāng)框架(通過(guò)一個(gè)命名為DefaultControllerActivator的服務(wù))要?jiǎng)?chuàng)建一個(gè)控制器的實(shí)例時(shí),它會(huì)解析IServiceProvider的所有構(gòu)造函數(shù)依賴項(xiàng).在上面的代碼中,它會(huì)使用Autofac容器來(lái)解析產(chǎn)生類。

這樣就能初步的達(dá)到我們替換IOC容器的的效果了..

但是,這個(gè)操作過(guò)程與asp.net MVC的不同之處在于.控制器本身不會(huì)從容器中解析出來(lái),所以服務(wù)只能從它的構(gòu)造器參數(shù)中解析出來(lái)。

所以.這個(gè)過(guò)程,讓我們無(wú)法使用Autofac的一些更高級(jí)功能.比如屬性注入(關(guān)于屬性注入的好壞..屬于仁者見(jiàn)仁智者見(jiàn)智的東西,這里我們不討論它是好還是壞.)

 

2.如何使用Autofac的高級(jí)功能,屬性注入.

我們回到Autofac設(shè)置代碼,并設(shè)置屬性注入如下:

var containerBuilder = new ContainerBuilder();

 //模塊化注入

  containerBuilder.RegisterModule<DefaultModule>();

  //屬性注入控制器

  containerBuilder.RegisterType<AutoDIController>().PropertiesAutowired();

  containerBuilder.Populate(services);

注入模塊的代碼修改如下:

//屬性注入builder.RegisterType<TestService>().As<ITestService>().PropertiesAutowired();

然后修改我們的控制器代碼如下:

public class AutoDIController : BaseController

 {

        public  ITestService _testService { get; set; }

        // GET: AutoDI

        public ActionResult Index()

        {

            ViewBag.date = _testService.GetList("Name");

            return View();

        }

}

這里我們剔除了控制器的構(gòu)造函數(shù).

我們運(yùn)行代碼,會(huì)發(fā)現(xiàn)_testService 為null,所以根本沒(méi)有注入成功.失敗的原因上面我們已經(jīng)解釋過(guò)了...但是還是強(qiáng)調(diào)一下吧..

雖然控制器的構(gòu)造函數(shù)依賴性將由MVC從IServiceProvider解決(也就是我們之前構(gòu)造函數(shù)注入的例子),

但是控制器本身的實(shí)例(以及它的處理)卻是由框架創(chuàng)建和擁有的,而不是由容器所有。

那么我們?cè)撊绾胃淖兛刂破鞅旧淼膭?chuàng)建和所有者呢?

我們會(huì)在Microsoft.Extensions.DependencyInjection中找到一個(gè)方法.叫做AddControllersAsServices

它的注釋翻譯過(guò)來(lái)為:將控制器的寄宿器轉(zhuǎn)為注冊(cè)的服務(wù)(也就是我們替換的autofac).

但是,注意..這里雖然是將控制的所有者改成了autofac,但是我們還是不能使用相關(guān)的屬性注入方法.

所以,我們到GITHUB上來(lái)看看這個(gè)方法源碼如下.(這就是開(kāi)源的好處...):

public static IMvcBuilder AddControllersAsServices(this IMvcBuilder builder)

        {

            if (builder == null)

            {

                throw new ArgumentNullException(nameof(builder));

            }

            var feature = new ControllerFeature();

            builder.PartManager.PopulateFeature(feature);

            foreach (var controller in feature.Controllers.Select(c => c.AsType()))

            {

                builder.Services.TryAddTransient(controller, controller);

            }

            builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());

            return builder;

        }

我們會(huì)發(fā)現(xiàn)最后一句..

builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());

意思是用ServiceBasedControllerActivator替換DefaultControllerActivator(意味著框架現(xiàn)在會(huì)嘗試從IServiceProvider中解析控制器實(shí)例)

..這下終于真相大白了..

我們只需要修改配置服務(wù)的代碼如下:

public IServiceProvider ConfigureServices(IServiceCollection services)

        {

            //替換控制器所有者

            services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());

            services.AddMvc();

            services.AddDbContext<BloggingContext>();

            services.AddDirectoryBrowser();

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterModule<DefaultModule>();

            //采用屬性注入控制器

            containerBuilder.RegisterType<AutoDIController>().PropertiesAutowired();

            // containerBuilder.RegisterTypes(feature.Controllers.Select(ti => ti.AsType()).ToArray()).PropertiesAutowired();

            containerBuilder.Populate(services);

            var container = containerBuilder.Build();

            return new AutofacServiceProvider(container);

        }

注意,替換的方法一定要在addMVC之前..

然后我們運(yùn)行我們的控制器代碼.效果如圖:

ASP.NET Core中如何采用Autofac來(lái)替換IOC容器并實(shí)現(xiàn)屬性注入

如圖所示,_testService已經(jīng)被實(shí)例化了.說(shuō)明我們的屬性注入就成功了~

看完上述內(nèi)容,你們對(duì)ASP.NET Core中如何采用Autofac來(lái)替換IOC容器并實(shí)現(xiàn)屬性注入有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

網(wǎng)站欄目:ASP.NETCore中如何采用Autofac來(lái)替換IOC容器并實(shí)現(xiàn)屬性注入
標(biāo)題URL:http://chinadenli.net/article14/ggicge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站維護(hù)外貿(mào)網(wǎng)站建設(shè)、ChatGPT定制開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)