c# - 无法在 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);
在剃刀页面成功时运行类似的东西?
解决方案
“字段初始化程序”在对象的构造函数之前立即运行。对于 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;
}
...
}
推荐阅读
- android - AltBeacon 库中的 ScanPeriod 和 BetweenScanPeriod 是什么意思?
- visual-studio-code - 如何使用键盘快捷键打开和关闭 VS Code 扩展?(它有一个内置的开和关设置)
- prolog - 为什么无法运行此代码?什么是 ECLiPSe-clp 中的“语法错误:预期的后缀/中缀运算符”错误
- typescript - 当我使用泛型类型时,为什么“void”不适用于可选参数?
- deep-learning - 多输入 DNN 的 LIME 图像分类解释
- javascript - 数据库表中唯一的随机字符串
- r - 优化用于计算 R 中生成的每个模型的 coef 和 r 平方的代码
- javascript - 如何在 vuecli 中使用 Moment.js
- c# - 使用列表按字母顺序对 MySQL 中的数据进行排序
& 在 C# 中返回排序列表的方法 - flutter - 在我的颤振应用程序中创建新用户时,我收到了 firebase_auth createUserWithEmailAndPassword 错误