我使用Blazor(.Net Core 3)启动了一个新项目,并争取在Blazor组件中接收数据的最佳方法。
据我所知,有两种可能性: 我可以实例化服务类,例如将CustomerService作为一个实例或作用域实例,然后使用[inject]属性将该服务插入我的Blazor组件。 或者,我可以将HTTP客户端插入Blazor组件中,然后直接调用Web API。
虽然第二种方法对我的场景不理想(我想将Json数据映射到模型类),但我不确定第一种方法是否正确?
更准确地说: 我有一个具有Get()方法的CustomerService。在此Get()方法中,我调用Web API以接收所有客户作为Json数据并返回我自己的模型类。 该CustomerService通过[inject]属性输入到我的组件中,然后我在其中调用CustomerService.Get()以获取我的客户模型。
最后,我将获得不同的服务,将它们注入需要的组件中。 这是有效的方法还是有更好的方法?
答案 0 :(得分:2)
您的问题与执行模式有关。
如果您使用Blazor客户端,则您的应用程序可能包含在浏览器上执行的客户端项目以及Web Api控制器所在的服务器项目。客户端和服务器项目之间通信的主要工具是Http。框架配置了Blazor客户端,以将HttpClient服务添加到DI容器,而您所要做的就是将其注入到组件或服务中,并使用它在控制器中调用终结点操作。请注意,您也可以使用SignalR ...
但是,如果使用Blazor服务器端执行模式,则可以使用HttpClient或服务来启用通信。
首先,您应该记住服务器端Blazor是在服务器上执行的,并且只有Html diff发送到用户的浏览器。因此,您可以创建一个服务,该服务可以直接访问您的数据存储(最好通过第二层;存储库),并且可以将该服务注入到组件中以执行所需的调用。
但是您可以使用Http来创建一个Web Api项目。这是合法的,开发人员选择对服务使用此方法。但是在这种情况下,您应该自己将HttpClient服务添加到DI容器中。建议使用IHttpClientFactory。
更新:
我建议您使用服务而不是控制器(Web Api端点)。这些服务应与控制器的方法一样精简,并且应主要调用它们以获取数据,而不是直接获取数据,而是通过为此目的定义的存储库。您可以将这些服务注入组件中,并在代码中使用它们。
在Blazor Server App的默认项目模板中,代码示例演示了如何创建服务,将其注入组件并使用其方法。 See here the project template and sample within it...
注意:在此示例中,服务直接访问数据,但是您确定应该在另一层,其他服务,存储库等中完成此操作。
This link is to a Blazor client-side sample named FlightFinder created by the Blazor team,演示了如何使用管理组件状态的App State Pattern。在Blazor的背景下熟悉这种模式非常重要。
还请注意,您可以在Blazor中使用MVVM模式。
由您决定走什么路...
如果它解决了您的问题,请介意将其标记为答案,以便其他人知道它很有用。
希望这对您有帮助...