Blazor University (51)依赖注入 —— 拥有多个依赖项:错误的方式

原文链接:https://blazor-university.com/dependency-injection/component-scoped-dependencies/owning-multiple-dependencies-the-wrong-way/

拥有多个依赖项:错误的方式

`OwningComponentBase`[1] 类是一个合适的解决方案,当我们需要我们的组件只拥有一个独立的依赖实例(以及它所依赖的任何 Scoped/Transient 依赖)时。但是,有时我们需要我们的组件拥有多个依赖项。

本节将演示实现此目标的错误方法,然后下一节将演示如何正确实现它。

概述

源代码[2]

使用 OwningComponentBase<T> 时要记住的是,只有在组件拥有的注入容器中创建的 T(存储在名为 Service 的属性中)。

OwningComponentBase<T> 的派生类上使用 @inject 指令将不会从组件自己的注入容器中注入依赖项。

注意: 如果您还没有这样做,如果您还不熟悉此类如何创建自己的注入容器,请阅读有关 OwningComponentBase[3] 的部分。

示例

对于本练习,我们将创建一个新的 Blazor 应用程序,该应用程序将演示通过 OwningComponentBase<T> 中的 T@inject 指令为我们的组件提供的服务的不同生命周期。

首先,创建一个新项目,并添加以下服务。

public interface IOwnedDependency
{public int InstanceNumber { get; }
}public class OwnedDependency : IDependencyOne
{private static volatile int PreviousInstanceNumber;public int InstanceNumber { get; }public OwnedDependency(){InstanceNumber =System.Threading.Interlocked.Increment(ref PreviousInstanceNumber);}
}

该类只是根据增加一个静态字段为自己分配一个新的 InstanceNumber,为每个实例提供一个序号。

接下来,使用名称 InjectedDependency 创建一段相同的代码并注册服务。

// Server-side apps, edit Startup.cs
services.AddScoped<IOwnedDependency, OwnedDependency>();
services.AddScoped<IInjectedDependency, InjectedDependency>();// WebAssembly apps, edit Program.cs
builder.Services.AddScoped<IOwnedDependency, OwnedDependency>();
builder.Services.AddScoped<IInjectedDependency, InjectedDependency>();

使用依赖

现在在 /Shared 文件夹中创建一个名为 MyOwningComponent 的组件,如下所示:

@inherits OwningComponentBase<IOwnedDependency>
@inject IInjectedDependency InjectedDependency<div>Service.InstanceNumber = @Service.InstanceNumber
</div>
<div>InjectedDependency.InstanceNumber = @InjectedDependency.InstanceNumber
</div>
  • 第 1 行

    OwningComponentBase<IOwnedDependency> 继承我们的组件,因此我们的组件将创建自己的注入容器并从中解析 IOwnedComponent 的实例。

  • 第 2 行

    使用标准 @inject 指令让 Blazor 将 IInjectedDependency 的实例注入我们的组件。

显示结果

最后,我们将编辑 Index.razor 文件。我们将创建一个布尔字段,并且仅在该字段为 true 时才渲染 MyOwnedComponent。这将告诉 Blazor 在需要时创建组件的实例,并在不需要时释放它。我们将 @bind 一个 HTML 复选框以允许用户切换组件。

@page "/"<input id="show-component" type=checkbox @bind=ShowComponent/>
<label for="show-component">Show component</label>@if (ShowComponent)
{<MyOwningComponent/>
}@code
{bool ShowComponent = false;
}

运行应用程序并切换复选框的状态将显示以下内容。

步骤拥有的服务注入的服务
1实例编号 = 1实例编号 = 1
2实例编号 = 2实例编号 = 1
3实例编号 = 3实例编号 = 1

结论

使用 @inject 指令时,Blazor 将从与当前用户会话(当前浏览器选项卡)关联的依赖项容器中注入 Scoped 依赖项。只有 OwnedComponentBase<T> 中的 T 会从与我们的 OwningComponentBase<T> 派生组件的实例一起创建和销毁的注入容器中解析。

ed00a40af163e6262ac97d743f1639a4.jpeg

组件拥有多个依赖项的正确方法将在有关非泛型 OwningComponentBase[4] 类的部分中介绍。

参考资料

[2]

源代码: https://github.com/mrpmorris/blazor-university/tree/master/src/DependencyInjection/OwningMultipleDependenciesTheWrongWay

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos的yum源更换为国内的阿里云源

1、备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo 或者 curl -o /etc/yum.repo…

Centos 7 搭建.net web项目

现在的.NET Core 1.0版本是一个很小的核心&#xff0c;APIs和工具也并不完整&#xff0c;但是随着.Net Core的不断完善&#xff0c;补充的Apis和创新也会一起整合到.NET Framework中。 安装centos系统 请自行安装或百度教程 安装 libicu包 和 dotnet 温馨提示&#xff1a;如果需…

Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法笔记-协议与分类...

23、通过委托与数据源协议进行对象间通信 如果要在委托对象上调用可选方法&#xff0c;那么必须提前使用类型信息查询方法判断这个委托对象能否响应相关选择子。 if ( [_delegate respondsToSelector:selector(networkFetcher:didReceiveData:)]){ [_delegate networkFetcher:s…

用matlab求解工作时间调度问题,置换流水车间调度问题的MATLAB求解.doc

物流运筹实务课程设计题目&#xff1a;置换流水车间调度问题的MATLAB求解置换流水车间调度问题的MATLAB求解目录前言……………………………………………………………………… 5问题描述………………………………………………………………… 6算法设计…………………………………

EntityFrameworkCore 模型自动更新(上)

【导读】嗯&#xff0c;距离上一次写博文已经过去近整整十个月&#xff0c;还是有一些思考&#xff0c;但还是变得懒惰了&#xff0c;心思也不再那么专注&#xff0c;有点耗费时间&#xff0c;学习也有点停滞不前&#xff0c;那就顺其自然&#xff0c;随心所欲吧&#xff0c;等…

IDEA 快捷注释

1. 新建类的注释模板 1) File->settings->Editor->Live Templates 2) 点击绿色号&#xff0c;选择template group &#xff0c;输入group的name&#xff0c;然后点ok 3) 选中刚才添加的group,点击号,选择live Template 4) 代码模板位置,个人用的代码: 1 /** 2 * &…

matlab 如何hidden,Matlab基本函数-hidden函数

1、hidden函数&#xff1a;设置或取消隐藏线模式2、用法说明(1)hidden on 函数对当前图形打开隐藏线条删除&#xff0c;使网格图后面的线条被前面的线条遮住。设置曲面图形对象的属性FaceColor为坐标轴背景颜色&#xff1b;(2)hidden off 函数对当前图形关闭隐藏线条删除&#…

java高级----Thread之CyclicBarrier的使用

CyclicBarrier是一个同步辅助类&#xff0c;它允许一组线程互相等待&#xff0c;直到到达某个公共屏障点 (common barrier point)。今天我们就学习一下CyclicBarrier的用法。 CyclicBarrier的简单使用 类CyclicBarrier不仅有CountDownLatch所具有的功能&#xff0c;还可以实现屏…

异常处理,究竟是处理什么

“系统中每行代码&#xff0c;都应该是有意义的&#xff0c;如果一段代码可有可无&#xff0c;那它就不应该存在。”01—内容简述异常处理是软件开发的必备技能&#xff0c;但“异常处理&#xff0c;究竟是处理什么&#xff1f;”&#xff0c;很多小伙伴并没有一个清晰的认识&a…

第十一篇:(顺序)容器的好伴侣 --- 容器适配器

前言 vector容器的数据结构原型是顺序表&#xff0c;它很好的实现了顺序表的功能&#xff0c;大大方便了编程。好了&#xff0c;现在假设有天我又想用栈&#xff0c;那么有没有栈对应的容器呢&#xff1f;很遗憾&#xff0c;木有。但基于“栈”可以由顺序表或者链表实现这一特性…

第一季度ADC市场份额揭榜 A10 Networks再获用户青睐

近日&#xff0c;根据全球知名咨询公司IDC 发布的2018年第一季度中国ADC市场分析报告显示&#xff0c;A10 Networks 稳占中国ADC市场份额第二名。数据来源&#xff1a;IDC 2018年Q1 ADC市场报告 从厂商排名来看依次为 F5 30%, A10Networks 12%, DPtech 12% ,Sangfor 9% &#…

zblog php 标题优化,Zblog分类页标题重复的优化 - 张力博客

今天疯子无聊上自己博客看看&#xff0c;点了几个页面就发现一个问题。我博客分类页的标题怎么第一页和后面的页数都是一样的&#xff0c;这一点相信大家都知道对于SEO优化是很不好的一点。我也看了同样的一些个人zblog博客也存在这样的问题。于是我在网上就找了关于修改zblog分…

利用linux shell自己主动顶贴

在论坛上面发帖问个什么东西的话&#xff0c;一旦不顶。帖子就秒沉了&#xff0c;可是又实在不想每时每刻都去顶&#xff0c;怎么办&#xff1f;以下展示了怎样利用shell 的crontab实现自己主动顶贴。 闲话不多说了&#xff0c;以豆瓣为例—– 1&#xff1a; 用chrome打开豆瓣…

Linux命令之telnet 命令

介绍 Telnet是常用的远程控制Web服务器的方法 Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序&#xff0c;用它连接到服务器。终端使用者…

深度学习库 SynapseML for .NET 发布0.1 版本

2021年11月 微软开源一款简单的、多语言的、大规模并行的机器学习库 SynapseML&#xff08;以前称为 MMLSpark&#xff09;&#xff0c;以帮助开发人员简化机器学习管道的创建。具体参见[1]微软深度学习库 SynapseML&#xff1a;可直接在系统中嵌入 45 种不同机器学习服务、支持…

Buildroot stress-ng Linux系统压力测试

/*********************************************************************** Buildroot stress-ng Linux系统压力测试* 说明&#xff1a;* 之前有使用lmbench对整板进行一些测试&#xff0c;如果相对某一部分专门进行测试&#xff0c;* 就可以参考使用stree-ng…

支持回调处理 php函数,PHP支持回调的函数有哪些?

PHP支持回调的函数有&#xff1a;1、匿名函数&#xff0c;代码为【$server->on Request】&#xff1b;2、类静态方法&#xff0c;代码为【static function test $req】&#xff1b;3、函数&#xff0c;代码为【my_onRequest $req】。PHP支持回调的函数有&#xff1a;1、匿名…

病毒木马查杀实战第019篇:病毒特征码查杀之编程实现

前言上次我们已经简介过了病毒特征码提取的基本方法&#xff0c;那么这次我们就通过编程来实现对于病毒的特征码查杀。定义特征码存储结构为了简单起见。这次我们使用的是setup.exe以及unpacked.exe这两个病毒样本。经过上次的分析&#xff0c;我们对setup.exe样本的特征码提取…

《ASP.NET Core 6框架揭秘》实例演示[22]:如何承载你的后台服务[补充]

借助 .NET提供的服务承载&#xff08;Hosting&#xff09;系统&#xff0c;我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载&#xff0c;ASP.NET Core应用最终也体现为这…

命令行打印文件树列表: tree

Linux & Mac 1.下载tree lib //mac brew install tree //centos yum install tree //ubuntu apt-get install tree 用法 //显示所有文件 tree //显示深度2层 tree -L 2 2. 命令find组合 find . -print | sed -e s;[^/]*/;|____;g;s;____|; |;g > structure.txt 移除node…