c# - DI 和基类
问题描述
我通过典型示例创建了简单的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
) 中实现,以便所有派生控制器都可以访问它。
没什么难的,我想了想改写成这样:
public class
[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
.
我做错了什么,现在是否能够以干净的方式完成这项工作?
解决方案
您需要将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
参数传递给它。
推荐阅读
- apache - Apache 配置:如何获得快速反馈?
- scala - 如何使用 apache spark 解析 EDIFACT 文件数据?
- google-app-engine-python - GAE python柔性环境安装第三方库C扩展失败
- javascript - SVG标签中的html文件和音频
- node.js - 无法使用gmail api节点js发送邮件
- javascript - 如何使用会话存储将项目设置为对象数组
- mongodb - Mongo DB with grafana False QUERY ,new Date()
- macos - MKMapView moveRight/Left on keyDown:
- firebase - 发布 Flutter 应用后,Google 登录不起作用
- sql - 将固定数字按重量除以多行