【问题标题】:How to fix the Dependency Injection error in Startup.cs class in .NET Core如何修复 .NET Core 中 Startup.cs 类中的依赖注入错误
【发布时间】:2021-09-13 02:28:50
【问题描述】:

我使用 ASP.NET Core 2.2 我正在尝试从 Startup 调用基本服务类。它抛出了这个异常:

InvalidOperationException:无法解析服务类型 尝试激活时出现“TIR.NetCore.ICommonLogService” 'AdminCentral.NetCore.Startup'。

这是我的代码:

public class Startup
{
    private readonly ICommonLogService _CommonLogService;
    public Startup(IConfiguration configuration, ICommonLogService CommonLogService)
    {
         _CommonLogService = CommonLogService;
         Configuration = configuration;
    }

    public IConfiguration Configuration { get; }
    public string connectionString;

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        var container = new Container();
        container.Configure(config =>
        {
            config.AddRegistry(new StructuremapRegistry());
            config.Populate(services);
        });

        return container.GetInstance<IServiceProvider>();
    }
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
      LogException(Exception )
   }

    private void LogException(Exception error, HttpContext context)
    {
         _CommonLogService.InsertLogDetail();
  }
}

【问题讨论】:

  • Startup 用于配置您的服务。您不能将尚未注册的类型传递给 Startup 构造函数本身。您可以使用IHostingEnvironmentIConfigurationILoggerFactory,但框架不知道ICommonLogService
  • 什么类应该实现ICommonLogService?我看不出将它注入Startup 类的意义,但很可能您应该在此处实例化它,因为它是应用程序的入口点。您通常会注入代码,因为您需要对获取注入代码的类进行单元测试,但在这种情况下,我真的怀疑您是否会对Startup 进行单元测试。换句话说,只需使用具体类型来创建一个新的 Logger 实例。

标签: c# asp.net-core dependency-injection


【解决方案1】:

如果你想在Startup.cs类中使用ICommonLogService,你需要像这样从容器中获取一个实例:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
     var container = new Container();
     container.Configure(config =>
     {
         config.AddRegistry(new StructuremapRegistry());
         config.Populate(services);
     });

     //Get an instance of ICommonLogService from container
     ICommonLogService CommonLogService = container.GetInstance<ICommonLogService>();
     //Use CommonLogService here

     return container.GetInstance<IServiceProvider>();
}

【讨论】:

  • 感谢更新帖子。如何从 ICommonLogService 调用方法
猜你喜欢
  • 2020-08-11
  • 2017-11-23
  • 2023-04-05
  • 2021-07-15
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 2023-02-24
  • 2020-11-20
相关资源
最近更新 更多