(5/30)大家一起學blazor:依賴注入(dependency injection)

(5/30)大家一起學blazor:依賴注入(dependency injection)

問題來了,為什麼blazor會知道weatherforecastservice在這裡可以調用?

最后更新 2021/12/11 下午1:27
StrayaWorker
预计阅读 3 分钟
分类
Blazor
专题
一起學blazor系列
标签
.NET C# ASP.NET Core Blazor

問題來了,為什麼 blazor 會知道 weatherforecastservice 在這裡可以調用?

點開 program.cs,可以找到一行代碼:

builder.Services.AddSingleton<WeatherForecastService>();

把这段代码注释,重新加载网页,点击Fetch data菜单,可以在页面看到下面的异常警告信息(只在页脚显示了一个警告块),详细警告看终端输出,因为我们试图在 FetchData.razor 调用 WeatherForecastService,却没告诉 Blazor 我们要注册这个服务。

页面异常警告提示

终端异常打印

複製提示看看,這個提示很明確:

Cannot provide a value for property 'ForecastService' on type 'BlazorServer.Pages.FetchData'. There is no registered service of type 'BlazorServer.Data.WeatherForecastService'.

不過這並不是 day03 說到的依賴注入,依賴注入的目的是擺脫高層級程式必須依賴於低層級程式的窘境,以減少耦合性。舉例來說,如果今天 fetchdata.razor 要調用其他 service,例如 newweatherforecastservice 的同名方法 getforecastasync,取回 10 條數據,那只要用到 weatherforecastservice 的地方都必須修改,目前因為 demo 的關係不多所以沒感覺,如果日後有 10 幾 20 幾個地方要改呢?

这时候就是依赖注入发挥功能的时候了,先定义一个接口:interface IWeatherForecastService

namespace BlazorServer.Data;

public interface IWeatherForecastService
{
	Task<WeatherForecast[]> GetForecastAsync(DateTime startDate);
}

里面就写我们要的方法:Task<WeatherForecast[]> GetForecastAsync(DateTime startDate);

也不用实现(虽然接口也能实现:站长注:在C#8.0中,针对接口引入了一项新特性,就是可以指定默认实现,方便对已有实现进行扩展,也对面向Android和Swift的Api进行互操作提供了可能性。),接着让 WeatherForecastService 跟 NewWeatherForecastService 继承 IWeatherForecastService

服务实现接口

program.cs 改用 iweatherforecastservice 跟 newweatherforecastservice 註冊

接口注入服务

看上面截圖,在 fetchdata.razor 中,也改為注入 iweatherforecastservice

重整加載網頁就能看到數據條數變為 10 條了

10条数据展示

依賴注入的核心就是“對某個功能的依賴性是通過注入的方式”,不直接調用底層程式,而是調用底層程式的接口,即便底層程式修改也不會導致所有調用該程式的調用端都必須改動。

註:由於筆者是在寫完這篇之後才想起來生命周期,原本想用 git rebase 的功能回到這一次的 commit 新增 demo,但會有 git 斷頭疑慮,所以筆者會在 day 07 再說明生命周期,若有不便敬請見諒。

註:本文代碼通過 .net 6 + visual studio 2022 重構,可點擊原文連結與重構後代碼比較學習,謝謝閱讀,支持原作者

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2021/12/25

(29/30)大家一起學blazor:blazor單元測試

開發一個系統最無聊的過程大概就是解決bug了,尤其是那種嘗試對null 對象取值的錯誤(`object reference not set to an instance of an object.`),這應該是大部分人剛踏入編程領域最常碰到的問題,為了從枯燥的解決bug過程解脫,這篇就來居間`單元測試`。

继续阅读
同分类 / 同标签 2021/12/25

(28/30)大家一起學blazor:policy-based authorization

之前有說到`asp.net core identity` 使用的是基於`claim` 的驗證,其實`asp.net core identity` 有不同類型的授權方式,最簡單的`登錄授權`、`角色授權`、`claim 授權`,但上述幾種都是以一種方式實現:原則授權(`policy-based authorization`)。

继续阅读