首页 > 解决方案 > 无法在 Blazor razor 页面(Blazor 服务器端)中注入 Controller、DbContext

问题描述

我正在使用最新的 .NET Core 技术堆栈,包括:Microsoft Visual Studio Community 2019 Preview Version 16.7.0 Preview 6.0;.NET Core 5.0.100-preview.7.20366.6;Microsoft.EntityFrameworkCore.SqlServer 版本 5.0.0-preview.7.20365.15 ;适用于我的 Blazor 服务器端 Web 应用的 Microsoft SQLServer 2019。

Startup.cs我有

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddSingleton<SysAutoIdController>();

在文件中SystemInformation.razor

@page "/system_information"
@using myproj.Forms
@using myproj.DTO
@using myproj.Models

@inject myproj.Data.ApplicationDbContext dbContext;
@inject myproj.Controllers.SysAutoIdController sysAutoIdController;


<h3>System information</h3>

database size = @foo

@code {
   string fooTemp = sysAutoIdController.getDbSize(dbContext);
   string foo = foo2.ToString();
}

控制器,文件SysAutoIdController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using myproj.Data;
using myproj.Models;
using Microsoft.EntityFrameworkCore;

namespace myproj.Controllers
{
    public class SysAutoIdController : Controller
    {
        ApplicationDbContext db = new ApplicationDbContext();

        public string getDbSize(ApplicationDbContext db2)
        {
            var foo = db2.SysautoId.FromSqlRaw("" +
        " SELECT a.dbdisk " +
        " FROM " +
            "(SELECT sys.databases.name AS dbname, " +
              "      CONVERT(VARCHAR, SUM(SIZE) * 8 / 1024) + \' MB\' AS dbdisk " +
            " FROM sys.databases " +
           " JOIN sys.master_files ON sys.databases.database_id = sys.master_files.database_id " +
           " GROUP BY sys.databases.name) a " +
        " WHERE a.dbname = \'mydatabase\' ");
            return foo.ToString();
        }
    }
}

错误

在此处输入图像描述

CS0236:字段初始化程序无法引用非静态字段、方法或属性“SystemInformation.sysAutoIdController”

CS0236:字段初始值设定项无法引用非静态字段、方法或属性“SystemInformation.dbContext”

如何sysAutoIdController.getDbSize(dbContext);在剃刀页面成功时运行类似的东西?

标签: c#asp.net-coreentity-framework-coreblazorblazor-server-side

解决方案


“字段初始化程序”在对象的构造函数之前立即运行。对于 Blazor 页面,就在任何注入发生之前。C# 语法不允许您使用尚未构造的实例中的任何内容。

@code {
   string fooTemp; // = sysAutoIdController.getDbSize(dbContext);
   string foo => foo2?.ToString();  // string.ToString() is a little pointless

    protected override async Task OnInitializedAsync()
    {
       // see if you can make getDbSize async, that would be better
       fooTemp = sysAutoIdController.getDbSize(dbContext);
    }
}

旁注:DbContext 是您需要管理的宝贵资源。让它注入控制器,你已经注册了所有东西:

public class SysAutoIdController : Controller
{
   public SysAutoIdController(ApplicationDbContext db)
   {
      _db = db;
   }

   ... 
}

    

推荐阅读