【问题标题】:.blazor dependency injection error: An unhandled exception occurred while processing the request.?.blazor 依赖注入错误:处理请求时发生未处理的异常。?
【发布时间】:2021-08-01 13:48:59
【问题描述】:

使用SqlSugar ORM,基于blazor,依赖注入业务服务,调用时报错。 SqlSugarService:

 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");
        }

错误:

处理请求时发生未处理的异常。 MissingMethodException:没有为类型“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");
    }


}

【问题讨论】:

  • “没有为类型 'MyReport.Pages.Report' 定义无参数构造函数。” - 向我们展示该类。
  • 添加无参构造函数后,没有报错,但是不知道为什么,已经添加了类代码
  • 注入方式不对吗?我要注入,就用
  • 你应该再次删除它b - 你现在有_reportRepository == null
  • 显示 Report.razor 的相关部分,可能还有 Report.razor.cs。看起来您在页面上使用构造函数注入?

标签: c# .net asp.net-core orm blazor


【解决方案1】:

在 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");                 
    }

}

【讨论】:

  • 谢谢,我明白了
猜你喜欢
  • 2022-11-12
  • 2012-01-20
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2021-02-20
  • 2020-06-09
相关资源
最近更新 更多