.blazor dependency injection error: An unhandled exception occurred while processing the request.?
.blazor dependency injection error: An unhandled exception occurred while processing the request.?
使用SqlSugar ORM,基于blazor,依赖注入业务服务,调用时报错。
SqlSugar服务:
public static class SqlSugarService
{
private static readonly ILog log = LogManager.GetLogger(typeof(SqlSugarService));
public static void AddSqlSugarSevice(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddScoped<ISqlSugarClient>(o =>
{
var listConfig = new List<ConnectionConfig>();
listConfig.Add(new ConnectionConfig
{
DbType = DbType.SqlServer,
ConnectionString = "Server=.\SQLEXPRESS;DataBase=Test;Uid=sa;Pwd=123456",
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
var dbContext = new SqlSugarClient(listConfig);
return dbContext;
});
}
}
界面:
public interface IReportRepository
{
public DataTable GetTest(string sql);
}
接口实现:
public class ReportRepository : IReportRepository
{
private ISqlSugarClient _dbBase;
public ReportRepository(ISqlSugarClient sqlSugar)
{
_dbBase = sqlSugar;
}
public DataTable GetTest(string sql)
{
return _dbBase.Ado.GetDataTable(sql);
}
}
注射:
services.AddSqlSugarSevice();
services.TryAddTransient<IReportRepository, ReportRepository>();
使用构造函数注入:
private readonly IReportRepository _reportRepository;
//[Inject]
//public IReportRepository ReportService { get; set; }
public Report(IReportRepository reportRepository)
{
_reportRepository = reportRepository;
_reportRepository.GetTest("select * from test");
}
错误:
An unhandled exception occurred while processing the request.
MissingMethodException: No parameterless constructor defined for type 'MyReport.Pages.Report'.
System.RuntimeType.CreateInstanceDefaultCtorSlow(bool publicOnly, bool wrapExceptions, bool fillCache)
public partial class Report
{
private readonly IReportRepository _reportRepository;
//[Inject]
//public IReportRepository ReportService { get; set; }
public Report()
{
}
public Report(IReportRepository reportRepository)
{
_reportRepository = reportRepository;
_reportRepository.GetTest("select * from test");
}
}
在 Razor 页面(组件)中,您必须使用 属性 注入,而不是构造函数注入。这意味着注入的服务在构造函数中不可用。这就是我们有 OnInitialized() 的原因。
我修复了我能看到的,删除注释掉的部分:
public partial class Report
{
//private readonly IReportRepository _reportRepository;
[Inject]
public IReportRepository ReportService { get; set; }
//public Report()
//{
//}
//public Report(IReportRepository reportRepository)
//{
// _reportRepository = reportRepository;
// _reportRepository.GetTest("select * from test");
//}
protected override OnItializedAsync()
{
// replace with async version if possible
// and assign to something?
ReportService.GetTest("select * from test");
}
}
使用SqlSugar ORM,基于blazor,依赖注入业务服务,调用时报错。 SqlSugar服务:
public static class SqlSugarService
{
private static readonly ILog log = LogManager.GetLogger(typeof(SqlSugarService));
public static void AddSqlSugarSevice(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddScoped<ISqlSugarClient>(o =>
{
var listConfig = new List<ConnectionConfig>();
listConfig.Add(new ConnectionConfig
{
DbType = DbType.SqlServer,
ConnectionString = "Server=.\SQLEXPRESS;DataBase=Test;Uid=sa;Pwd=123456",
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
var dbContext = new SqlSugarClient(listConfig);
return dbContext;
});
}
}
界面:
public interface IReportRepository
{
public DataTable GetTest(string sql);
}
接口实现:
public class ReportRepository : IReportRepository
{
private ISqlSugarClient _dbBase;
public ReportRepository(ISqlSugarClient sqlSugar)
{
_dbBase = sqlSugar;
}
public DataTable GetTest(string sql)
{
return _dbBase.Ado.GetDataTable(sql);
}
}
注射:
services.AddSqlSugarSevice();
services.TryAddTransient<IReportRepository, ReportRepository>();
使用构造函数注入:
private readonly IReportRepository _reportRepository;
//[Inject]
//public IReportRepository ReportService { get; set; }
public Report(IReportRepository reportRepository)
{
_reportRepository = reportRepository;
_reportRepository.GetTest("select * from test");
}
错误:
An unhandled exception occurred while processing the request. MissingMethodException: No parameterless constructor defined for type 'MyReport.Pages.Report'. System.RuntimeType.CreateInstanceDefaultCtorSlow(bool publicOnly, bool wrapExceptions, bool fillCache)
public partial class Report { private readonly IReportRepository _reportRepository; //[Inject] //public IReportRepository ReportService { get; set; } public Report() { } public Report(IReportRepository reportRepository) { _reportRepository = reportRepository; _reportRepository.GetTest("select * from test"); } }
在 Razor 页面(组件)中,您必须使用 属性 注入,而不是构造函数注入。这意味着注入的服务在构造函数中不可用。这就是我们有 OnInitialized() 的原因。
我修复了我能看到的,删除注释掉的部分:
public partial class Report
{
//private readonly IReportRepository _reportRepository;
[Inject]
public IReportRepository ReportService { get; set; }
//public Report()
//{
//}
//public Report(IReportRepository reportRepository)
//{
// _reportRepository = reportRepository;
// _reportRepository.GetTest("select * from test");
//}
protected override OnItializedAsync()
{
// replace with async version if possible
// and assign to something?
ReportService.GetTest("select * from test");
}
}