https://blazor-university.com/学习笔记。

Dependency injection

DI把需要注入的类通过框架来例现化,而不是自己例现化。

Injecting dependencies into Blazor components

在.razor中,可以如下注入:

@inject IToDoApi ToDoApi
@inject ISomeServiceType AnotherService

@code
{
  [Inject]
  private IYetAnotherServiceType PropertyInjectedDependency { get; set; }
}

对于.cs中,可以通过构造函数注入:

public class NewsletterService : INewsletterService
{
  private readonly IEmailService EmailService;

  public NewsletterService(IEmailService emailService)
  {
    EmailService = emailService;
  }
}

准备注入的服务:

public static async Task Main(string[] args)
{
  var builder = WebAssemblyHostBuilder.CreateDefault(args);
  builder.RootComponents.Add<App>("app");

  builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

  // Register our own injectables
  builder.Services.AddSingleton<IToDoApi, ToDoApi>();

  await builder.Build().RunAsync();
}

Dependency lifetimes and scopes

注入的两个基本问题:

  • 注入对象的存活时长如何界定
  • 注入对象的现例是否被共享

Microsoft.Extensions.DependencyInjection.ServiceLifetime定义有Singleton,Scoped以及Transietn三种注入范围。

Transient dependencies

此种注入范围跟组件自身使用new来创建现例差别不大。框架只是作为一个类工厂。

如果此范围注入的类实现了IDispoable,那么可能会产生内存泄漏。

若注入的类不是Disposable,则框架可以创建之然后不管。若是Disposable,则框架需要保留到注入对象的引用。这样就要等到框架终结的时候才能调用Dispose注入的对象。可是框架可能需要等到浏览器页面关闭的时候才会终结……

Singleton dependencies

此注入类型,对于每次注入,都是用一个对象。

对于Server类型,Single可以同时给多个用户分享,只要它们共属于一个服务端的应用进程。但是对于WASM就不行了,跨不了浏览器进程。

Scoped dependencies

此为注入纳入框架管理的最大理由,对于WASM则可以略过。

Comparing dependency scopes

略。

Component scoped dependencies

如何影响框架的注入行为。

OwningComponentBase<T>

略。

Owning multiple dependencies: The wrong way

略。

Owning multiple dependencies: The right way

OwningComponentBase class component will create its own dependency container and resolve an instance of T within that container so the instance of T is private to our component.

(本篇完)