前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Day 05 依賴注入(Dependency Injection)

Day 05 依賴注入(Dependency Injection)

作者头像
沙漠尽头的狼
发布2021-12-15 16:11:25
3150
发布2021-12-15 16:11:25
举报
文章被收录于专栏:Dotnet9Dotnet9

问题来了,为什么Blazor会知道WeatherForecastService在这里可以调用?

点开Program.cs,可以找到一行代码:

代码语言:javascript
复制
builder.Services.AddSingleton<WeatherForecastService>();

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

页面异常警告提示

终端异常打印

复制提示看看,这个提示很明确:

代码语言:javascript
复制
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

代码语言:javascript
复制
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再说明生命周期,若有不便敬请见谅。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet9 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档