首页 > 解决方案 > 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.

我做错了什么,现在是否能够以干净的方式完成这项工作?

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

解决方案


您需要将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参数传递给它。


推荐阅读