Autofac 如何协助 .NET Core MVC 做 Dependency Injection- 图解概述

https://ithelp.ithome.com.tw/upload/images/20211208/201446142WOVjddpFC.jpg

Autofac为可以帮忙达成DI的套件,其运作可以参考运作描述,与如何协助ASP.NET MVC达成DI
这次要了解如何为Dot NET Core MVC应用程序达成DI,势必也要先了解Dot NET Core原本是如何运作的。可以参考 “Dot NET Core Host - 运作概述图解” ,以图来观察比较容易。
所以会挑出原本 Dot NET Core 产生 Service Provider 的地方做比较,然後替换成Autofac套件所使用的物件。
原本Dot NET Core 产生 Service Provider如下:

https://ithelp.ithome.com.tw/upload/images/20211208/20144614bZVdQ1s1Ts.jpg

利用预设的 ServiceFactoryAdapter 与 DefaultServiceProviderFactory,建立了Provider。
其以ServiceCollection为参数透过DynamicServiceProviderEngine与父类别ServiceProviderEngine产生CallSiteFactory实体为属性,存回HostBuilder的_appServices。如果要实现已经注册的服务,可以呼叫透过DynamicServiceProviderEngine继承的ServiceProvider中的函示GetService来进行resolve。
所以整个蓝色的 Microsoft.Extensions.DependencyInjection 区域就是产生 Provider 的关键处。如果要取代成由Autofac来做DI,HostBuilder的_appServices 势必要取到由 Autofac 所产生的 Provider。
所以替换如下:

https://ithelp.ithome.com.tw/upload/images/20211208/20144614iSOkzUKA3s.jpg

经由替换成 AutofacServiceProviderFactory後,其CreateBuilder函式所产生的容器就是 Autofac 的 ContainerBuilder 了,在这个函式会将原本Dot NET Core 的 ServiceCollection 所包含注册好的 service 的东西转成注册到 ContainerBuilder 上。
接下来呼叫AutofacServiceProviderFactory的CreateServiceProvider函式,会将 Autofac 的 ContainerBuilder做 build的动作,将注册好的的服务设置好。关於此可以参考 “Autofac 套件如何达成IOC 目的- 概述图解”。
接下来开发者可以於专案中的 Startup 类别 加入下列函式,注册想要resolve的服务至 Autofac Container 中:
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(new AutofacModule());
}
此段函式会在 Startup.ConfigureServices 在做 services.AddControllersWithViews() 或 services.AddController() 时,会执行Microsoft.AspNetCore.Hosting 下的 GenericWebHostBuilder 的 UseStartup 会抓出此 method 来执行。
最後将范例做简单的展示:

https://ithelp.ithome.com.tw/upload/images/20211208/20144614kftOU2iUjo.jpg

https://ithelp.ithome.com.tw/upload/images/20211208/20144614iaseWp0gIM.jpg

https://ithelp.ithome.com.tw/upload/images/20211208/20144614pKRcRaUNCr.jpg

https://ithelp.ithome.com.tw/upload/images/20211208/20144614XdW2SaRu1m.jpg

https://ithelp.ithome.com.tw/upload/images/20211208/20144614acxZRlEBQZ.jpg


<<:  Free Ringtone For Mobile Phones

>>:  为了转生而点技能-JavaScript,day17(原型-prototype、自订原型、新增method

Day28:错误处理

讲一个经典案例除以0,首先创造一个DivideByZeroEXception类别继承runtime_...

Day 23 - Either Monad

到目前为止,我们介绍 Maybe Monad 其是专门处理无值情境以及 IO Monad 则是处理同...

[Day - 28] React Hooks useState 学习笔记

前言 这篇文章将会介绍 React Hooks,Hook 是 React 16.8 中增加的新功能。...

Day 5 他国气象局网站分析(加、日、台)

接下来我会看看相关网页是如何设计的,这里参考了约 10 个国家的气象局官网,但囿於内容篇幅,仅简单列...

Day.27 实务应用 - 实作表自动分区管理( event / procedure / partition )_2

延续昨天的流程内容,做到能输入参数(资料库&资料表)判断有无分区的作用~ 确保有切表的状况...