5/30

5/30

問題は、なぜBlazorはWeatherForecast Serviceがここで呼び出すことができることを知っているのですか?

最后更新 2021/12/11 13:27
StrayaWorker
预计阅读 2 分钟
分类
Blazor
专题
ブレザーシリーズを学ぶ
标签
.NET C# ASP.NET Core Blazor

問題は、なぜBlazorはWeatherForecast Serviceがここで呼び出すことができることを知っているのですか?

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'.

しかし、これは3日目の依存注入ではありません。依存注入の目的は、結合を減らすために上位レベルのプログラムが下位レベルのプログラムに依存しなければならないというジレンマから抜け出すことです。例えば、今日FetchData.razorがNewWeatherForecast Serviceの同じ名前のメソッドGetForecastAsyncのような他のサービスを呼び出して10個のデータを取得する場合、WeatherForecast Serviceを使用している場所はすべて変更する必要がありますが、現時点ではデモとの関係があまりないので、将来変更する場所が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をIWeatherForecast ServiceとNewWeatherForecast Serviceに置き換える

接口注入服务

FetchData.razorでは、代わりにIWeatherForecast Serviceを注入します。

ページの読み込みを変更すると、データの数が10になります。

10条数据展示

依存注入のコアは、“関数への依存は注入によって行われる”ということです。低レベルのプログラムを直接呼び出すのではなく、低レベルのプログラムのインターフェイスを呼び出し、低レベルのプログラムを変更しても、そのプログラムを呼び出すすべての呼び出し元が変更される必要はありません。

注:この記事を書いた後にライフサイクルを思い出したので、git rebaseの機能を使って今回のcommit追加デモに戻りたかったのですが、gitの切断が疑われるので、Day 0 7にライフサイクルを説明しますので、ご不便をおかけします。

**注:このコードは. NET 6 + Visual Studio 2022リファクタリングを通じて、元のリンクとリファクタリング後のコードを比較することができます。読んでいただきありがとうございます。

Keep Exploring

延伸阅读

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

(29/30みんなで学ぶBlazor:Blazorユニットテスト

システムを開発する最も退屈なプロセスは、バグを解決することです。特に、nullオブジェクトに値を取ろうとするエラーです`Object reference not set to an instance of an object.`,これは、ほとんどの人がプログラミングの分野に足を踏み入れたばかりの最も一般的な問題である必要があります。退屈なバグ解決プロセスから解放するために、この記事では、単体テストを紹介します。

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

(28 Blazor:Policy Based Authorizationの略。

前に`ASP.NET Core Identity`は`Claim`に基づいた検証を使用していると述べたが、実は`ASP.NET Core Identity`には異なる種類の認可方式があり、最も簡単な`ログイン認可`、`ロール認可`、`Claim認可`があるが、上記のいくつかの種類はすべて一つの方式で実現されている:原則認可`Policy-based authorization`。

继续阅读