如何将依赖项注入构造函数控制器
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)
我正在尝试配置一个 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)