我可以在我的Blazor应用程序中使用多个OwningComponentBase<T>吗?

我正在使用一个模板Blazor应用程序来学习,我想添加一个新的页面来CRUD一个新的表.我为它创建了一个新的服务。

模板已经有了一个CRUD-page和一个服务。@inherits OwningComponentBase<WeatherForecastService> 这很好用。

在我的新页面中,我添加了 @inherits OwningComponentBase<ClientService> 但现在 ServiceOnInitializedAsync() 是不工作的,我没有访问我的方法的 ClientService. 我设法让它工作,以添加 @inject ClientService ClientService 并使用 ClientService 而不是。

但我想知道这样的做法是否正确,是不是应该用 @inherits OwningComponentBase<ClientService> 只是工作?

我确实把服务添加到 ConfigureServices: services.AddScoped<WeatherForecastService>(); services.AddScoped<ClientService>();

解决方案:

OwningComponentBase 是为了一个特定的目的:它提供的服务,范围是组件。对象可以有三种寿命:瞬时、scoped或singleton。Singleton是一个非问题,因为无论如何你都只会有一个实例,但瞬态和scoped在Blazor中并不合适,因为在任何一种托管模式(服务器或客户端)中,事物的持久性都比传统的Web应用要长得多。

有一个通用和非通用版本的 OwningComponentBase. 在通用版本中(你目前使用的版本),你可以访问一个范围内的服务(通过 Service)的类型,通过通用类型参数指定。这里没有什么真正神奇的东西。它只是在字面上设置了一个类似于 T的通用类型,到 Service 属性,当组件超出作用域时,该属性将被处理掉(什么?OwningComponentBase 负责)。) 非通用版本只是让你访问了一个叫做 ScopedServices 属性,它只是一个范围化的服务提供者,可以从其中提取任何你喜欢的服务,所以你可以把通用版本看成只是使用这个范围化的服务提供者为你获取一个单一的服务,并设置了 Service 与之对应。

长话短说,你可以在generic type param中扔任何你想要的类型,假设它是在服务提供商那里注册的。你在这里告诉我们的只是它 “不工作”,所以不清楚你的问题是什么。更有可能的是,你根本没有注册你的 ClientService 经由 services.AddScoped<ClientService>().

给TA打赏
共{{data.count}}人
人已打赏
未分类

angular 6聊天框的应用和ID高度

2022-9-8 2:23:16

未分类

Selenium无法通过ID或xpath找到元素。

2022-9-8 2:23:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索