如何将依赖项注入构造函数控制器

how to inject depencies to constructor controller

我正在尝试配置一个 API 控制器使用依赖注入将对象注入该控制器

public class BaseAPIController
{
    private readonly Repository _repository;
    public BaseAPIController(Repository repository)
    {
        _repository = repository;
    }

    // some common functions and properties are declared here
}
public class AccountController : BaseAPIController
{
    public AccountController(Repository repository) : base(repository)
    {  }
}

但它抛出一个异常,提示“某些服务无法构建...”

我尝试了一个使用 ILogger<Repository> 而不是 Repository 实例的解决方案,然后它可以正常运行

public class AccountController : BaseAPIController
{
    public AccountController(ILogger<Repository> repository) : base(repository)
    {  }
}

startup.cs代码中的注册服务

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddScoped<IRepository, Repository>();
    services.AddSingleton<WeatherForecastController, WeatherForecastController>();
}

和存储库的声明class

public interface IRepository
{
    void DoSomething1();
    void DoSomething2();
    void DoSomething3();        
}
public class Repository : IRepository
{
    public readonly string _connectionString;

    public Repository(string connectionString)
    {
        _connectionString = connectionString;
    }
    public void DoSomething1() {}
    public void DoSomething2() {}
    public void DoSomething3() {}
}

如何在不使用 ILogger 实例的情况下归档上面的配置 谢谢

问题是 DI 无法创建 Repository 的实例,因为没有无参数构造函数。 Take a look 在文档中用于注入设置而不是在构造函数中要求字符串。将连接字符串添加到 appsettings.json 文件:

{
  "AppSettings": {
    "ConnectionString": "<connection_string>"        
  }
}

ConfigureServices 中注册您的设置 class:

public class AppSettings
{
    public string ConnectionString;
}

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<AppSettings>(Configuration.GetSection(AppSettings));
    ...
}

那么你的 Repository class 构造函数将如下所示:

public Repository(IOptions<PositionOptions> options)
{
    _connectionString = options.Value.ConnectionString;
}

您还需要将接口 IRepository 而不是具体的 class 注入您的控制器。

public class BaseAPIController
{
    private readonly IRepository _repository;
    public BaseAPIController(IRepository repository)
    {
        _repository = repository;
    }

    // some common functions and properties are declared here
}

这是您进行的注册:

services.AddScoped<IRepository, Repository>();

但这是 AccountController 的构造函数:

AccountController(Repository repository)

注意 AccountController 如何取决于具体类型 Repository;不在 IRepository 界面上。由于此注册,Repository 只能 通过其 IRepository 接口解析,而不是直接解析(这是 MS.DI 的设计)。 =20=]

因此,解决方案是将 AccountController 的构造函数更改为以下内容:

AccountController(IRepository repository)