首页 > 解决方案 > .Net Core 服务未注册

问题描述

我有以下两个带接口的类

public interface IInterface1
{
 //declarations
}

public class class1 : IInterface1
{
 //definitions
}

public interface IInterface2
{
//declarations
}

public class class2 : IInterface2
{
   private readonly IInterface1 _interface;
   //constructor
   public class2(IInterface1 interface1)
   {
     //getting null for interface1
     _interface = interface1;
   }
}

和一个控制器,我在其中注入IInterface2

public class MyController : Controller
{
  private readonly IInterface2 _usecase;
  public MyController(IInterface2 usecase)
  {
    _usecase = usecase;
  }
}

在 Startup.cs 我已经注册了这样的服务

public void ConfigureServices(IServiceCollection services)
{
  services.AddScoped<IInterface2, class2>();
  services.AddScoped<IInterface1, class1>(x => (class1)x.GetService<IInterface1>());
}

面临的问题是当我在class2中注入IInterface1时无法访问构造函数中 interface1 的属性而不是获取 null

标签: c#asp.net-coredependency-injection

解决方案


如果您将配置替换为以下内容,则您在问题中显示的示例效果很好:

public void ConfigureServices(IServiceCollection services)
{
  services.AddScoped<IInterface2, class2>();
  services.AddScoped<IInterface1, class1>();
}

请注意,您写的那行:

services.AddScoped<IInterface1, class1>(x => (class1)x.GetService<IInterface1>())

正在导致Access Violation

(因为,当Interface1需要时,依赖系统会尝试Interface1从依赖系统中获取...一个,使用GetService无限递归执行此规则)

我们需要更多详细信息来了解您的问题并帮助解决问题。

您可能需要为您的类创建一个工厂,或者解决您在评论中提到的循环依赖,这显然会阻止您使用此处显示的简单注入。


推荐阅读