通过典型示例,我已经创建了简单的 asp.net核心应用程序,它可以按预期工作。然后,我通过 appsettings.json 添加了配置支持,如下所示:
[ApiController]
[Route("[controller]/[action]")]
public class MyController: BaseController
{
private IConfiguration _configuration = null;
public MyController(IConfiguration configuration)
{
_configuration = configuration;
}
//some actions here
}
,它也起作用。
但是现在我想在我的基类(Configuration
)中实现BaseController
,以便所有派生的控制器都可以访问它。
没事,我想着并重写为:
公共课
[ApiController]
[Route("[controller]/[action]")]
public class MyController: BaseController
{
//some actions here
}
public class BaseController: ControllerBase
{
private IConfiguration _configuration = null;
public IConfiguration Configuration
{
get
{
return _configuration;
}
}
public BaseController(IConfiguration configuration = null)
{
_configuration = configuration;
}
}
尽管此代码使用基类构造函数中的参数默认值成功编译,但Configuration
始终为null
。
我做错了什么,现在可以使它以干净的方式进行吗?
答案 0 :(得分:1)
您需要将IConfiguration
参数从子类构造函数传递给基类构造函数。
示例:
public abstract class BaseClass
{
protected IConfiguration _configuration;
public BaseClass(IConfiguration configuration)
{
_configuration = configuration;
}
}
请注意,如果希望能够从子类访问基类的实例变量IConfiguration
,则需要对其进行保护。
public class SubClass : BaseClass
{
public SubClass(IConfiguration configuration) : base(configuration) { }
}
通过添加base(configuration)
,您将调用基类构造函数并将configuration
参数传递给它。
答案 1 :(得分:0)
首先。用abstract
构造函数标记您的基类protected
。使用子类中的base
关键字可以实例化基类中的私有字段IConfiguration。
public class MyController(IConfiguration configuration) : base(configuration) {}
public abstract class BaseClass
{
protected BaseClass(IConfiguration configuration) { _configuration = configuration; }
}