Heim  >  Fragen und Antworten  >  Hauptteil

Der Dienst in der Blazor-Komponente kann nicht aufgerufen werden

<p>Ich habe einen Dienst, der so aussieht: </p> <pre class="brush:php;toolbar:false;">Namespace Hydra.Services { Mitarbeiter der öffentlichen Klasse { öffentliche String-URL { get; öffentliche asynchrone Aufgabe<EmployeeModel> // JSON-Daten zurückgeben } } }</pre> <p>Ich möchte diesen Dienst in meiner <code>Company</code>-Komponente aufrufen: </p> <pre class="brush:php;toolbar:false;">@page "/" <div> @company ... </div>!-- OK, Firmendetails wurden gerendert --> <div> @Employee ... </div> <!-- System.NullReferenceException: 'Objektreferenz ist nicht auf eine Instanz eines Objekts festgelegt. ' --> @code { Unternehmenszeichenfolge; Mitarbeiterzeichenfolge; protected überschreibt die asynchrone Aufgabe OnInitializedAsync() mit (HttpClient client = new HttpClient()) { // Firmendetails abrufen // Hier ist das Problem: EmployeeModel emp = new Employee(); emp.url = "http://google.com"; emlpoyee = warte auf emp.Employee(); } } }</pre> <p>An der Logik der Anzeige des Unternehmens ist also nichts auszusetzen, aber der Mitarbeiterdienst, den ich mit() aufrufe, scheint nicht zu funktionieren. Ich weiß nicht, was außer dem Fehler falsch ist. </p> <p>Es geht nicht darum, zu vergessen, ein Modell einzuschließen oder einen Dienst einzubinden. </p> <p>Ich bin nur ein Anfänger, daher sind die Fragen relativ einfach. </p>
P粉351138462P粉351138462415 Tage vor456

Antworte allen(2)Ich werde antworten

  • P粉496886646

    P粉4968866462023-09-01 10:39:42

    您创建了变量:

    @emlpoyee

    但您正在调用 @Employee,这将是 null。

    尝试切换到您实际放入员工的变量:

    @emlpoyee

    另外,我认为您拼写了变量错误。也许您的意思是 @employee。

    您在这里填充了所有内容:

    emlpoyee = await emp.Employee();

    因此,从您提供的代码来看,调用 @emlpoyee 是有意义的。

    所以将 <div> @Employee ... </div> 改为 <div> @emlpoyee ... </div>

    Antwort
    0
  • P粉513316221

    P粉5133162212023-09-01 09:57:36

    您的代码没有正确执行服务注入。我向您介绍一种我使用的方法,它可以正确工作,希望对您有用。

    首先,您需要为您的服务创建一个接口:

    namespace Hydra.Services
    {
        public interface IEmployee
        {
            Task<EmployeeModel> GetEmployee();
        }
    }

    然后,您需要修改您的服务,继承自上述接口,如下所示:

    namespace Hydra.Services
    {
        public class Employee:IEmployee
        {
            public async Task<EmployeeModel> GetEmployee()
            {
                // 返回JSON数据
            }
        }
    }

    现在,您应该在Startup.csProgram.cs中注入服务,如下所示:

    services.AddScoped<IEmployee,Employee>();

    最后,您应该在所需的组件中注入您的服务,如下所示,并轻松使用它:

    @page "/"
    @using Hydra.Services
    @inherits OwningComponentBase<IEmployee>
    
    <div> @company ... </div> <!-- OK,公司详细信息已呈现 --> 
    <div> @Employee ... </div>  <!-- System.NullReferenceException: '对象引用未设置为对象的实例。' -->
    
    @code {
    
        private string company; 
        private EmployeeModel emlpoyee = new EmployeeModel; 
    
        private IEmployee employeeService => Service;
    
        protected override async Task OnInitializedAsync()
        
        // 获取公司详细信息
    
    
        // 这里是问题所在:
            EmployeeModel emp = new EmployeeModel();
            emp.url = "http://google.com";
            emlpoyee = await employeeService.GetEmployee(); 
        
    }

    当然,您的代码有很多结构问题,您可能只是想以示例代码的形式指定问题,因此我试图解释使用您自己的代码的工作方法,以便示例对您更具体。

    Antwort
    0
  • StornierenAntwort