问题来了,为什麽Blazor会知道WeatherForecastService在这里可以调用?
day03有提到Startup.cs的ConfigureServices的目的就是「设定服务」,Controller把资料回传这件事情就是一种服务,我们点开Startup.cs,可以在ConfigureServices找到一行程序
services.AddSingleton<WeatherForecastService>();
把这行字拿掉,重整网页,可以看到这样的错误讯息,因为我们试图在FetchData.razor调用WeatherForecastService,却没告诉Blazor我们要注册这个服务。
不过这并不是day03说到的依赖注入,依赖注入的目的是摆脱高层级程序必须相依於低层级程序的窘境,以减少耦合性。举例来说,如果今天FetchData.razor要呼叫其他Service例如NewWeatherForecastService的同名方法GetForecastAsync,取回10笔资料,那只要用到WeatherForecastService的地方都必须修改,目前因为范例的关系不多所以没感觉,如果日後有10几20几个地方要改呢?
这时候就是依赖注入发挥功能的时候了,先定义一个介面
interface IWeatherForecastService
里面就写我们要的方法
Task<WeatherForecast[]> GetForecastAsync(DateTime startDate);
也不用实作(虽然介面也不能实作),接着让WeatherForecastService
跟NewWeatherForecastService
继承IWeatherForecastService
Startup.cs
改用IWeatherForecastService
跟NewWeatherForecastService
注册
最後在FetchData.razor
改为注入IWeatherForecastService
重整网页就能看到资料笔数变为10笔了
依赖注入的核心观念就是「对某个功能的依赖性是透过注入的方式」,不直接呼叫底层程序,而是呼叫底层程序的介面,即便底层程序更动也不会导致所有呼叫该程序的呼叫端都必须改动。
注:由於笔者是在写完这篇之後才想起来生命周期,原本想用git rebase的功能回到这一次的commit新增范例,但会有git断头疑虑,所以笔者会在day 07再说明生命周期,若有不便敬请见谅。
恐龙书上的 User Mode 与 Kernel Mode 在恐龙书中有提到,作业系统一般会在 Us...
当我们在测试机确认过金流功能皆能正常运作後,接下来就是要把我们开发的外挂上传客户主机的时候了,在上传...
前言 JS 30 是由加拿大的全端工程师 Wes Bos 免费提供的 JavaScript 简单应用...
上一回讲到两种搜寻演算法,一种是一个一个找,一种则是每次寻找都可以去掉一半的选项,好像有一种是明显比...
同步发表到驴形笔记 什麽都略懂一点,生活更多彩一些。 经过这ㄧ系列跑下来,应该有摸索到各式各样的新...