【问题标题】:How to call method from services?如何从服务中调用方法?
【发布时间】:2021-01-14 00:13:19
【问题描述】:

服务逻辑:从api获取数据并设置为属性。之后,我在 blazor 客户端上调用道具。 服务:

public class TmdbService
{
    private static JsonConfig _config = new JsonConfig();
    private readonly TMDbClient _client = new TMDbClient(_config.Settings.TApiKey);

    public async Task GetAllMovieInfo(string title, string lang = "ru")
    {
        SearchContainer<SearchMovie> results = await _client.SearchMovieAsync(title, lang);
        var movieData = results.Results.Take(1);
        foreach(var data in movieData)
        {
            new MovieDataDetail
            {
               Id = data.Id,
               Title = data.Title,
               OriginalTitle = data.OriginalTitle,
               ReleaseDate = data.ReleaseDate,
               Image = data.PosterPath,
               Popularity = data.Popularity,
               Overview = data.Overview
            } 
        }
    }
}

客户:

@page "/counter"
@using MovieApp.Shared.Services.TmdbApi
@using MovieApp.Shared.Models.MovieData

<div>
    <h1>The name of the movie: @detail.OriginalTitle</h1>
    <h1>The overview of the @title: @detail.Overview</h1>
    @*<h1>Ratings: @detail.IMDbRating</h1>*@
</div>

@code {
    TmdbService service;
    MovieDataDetail detail;
    string title = "lucy";

    protected override Task OnInitializedAsync()
    {
        detail = new MovieDataDetail();
        service = new TmdbService();
        return service.GetAllMovieInfo(title);
    }
}

我的服务在我的控制台项目中使用时运行良好。

A message from the error console:

我真的不知道如何解决它。请帮帮我

【问题讨论】:

  • 根据您的堆栈跟踪,您的库TMDbLib.RestClient 正在将Proxy 属性设置为一个值(即使它为空)。您引用的will throw the exception。库中有问题的行是this。如果不依赖您的库来更新他们的代码,您可能无能为力。
  • @KirkWoll 谢谢!我创造了这个问题。顺便说一句,我是你在 github 上的新追随者(:

标签: c# blazor blazor-webassembly


【解决方案1】:

注意:您的服务是在服务器上使用还是在客户端上使用?如果不是,则在客户端上定义它们,而不是在共享项目上...

您不能以您的方式使用您的服务...您应该将您的服务添加到 DI 容器中,例如:

 builder.Services.AddScoped<ITmdbService, TmdbService>();

注意:以上代码需在Client项目的Program.Main方法中设置 注意:ITmdbService 是由TmdbService 类实现的接口。如果你没有定义这样的接口,那么你的代码应该是:

 builder.Services.AddScoped<TmdbService>();

现在,您应该像这样将ITmdbService 注入您的 Counter 组件中

@page "/counter"
@inject ITmdbService TmdbService

请注意,我使用的是接口标识符,而不是类名。如果你没有定义这样的接口,你应该这样做:

@inject TmdbService TmdbService

第一个TmdbService,从左到右,是服务类名。第二个是一个名为 TmdbService 的属性,其中插入了一个对象的实例。

现在在您的代码中,您可以像这样使用它:

TmdbService.GetAllMovieInfo(title); 

请注意,如果未在客户端上定义,则必须向服务添加 using 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2011-06-18
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多