DI和基类

时间:2019-03-13 12:53:50

标签: c# inheritance asp.net-core dependency-injection

通过典型示例,我已经创建了简单的 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

我做错了什么,现在可以使它以干净的方式进行吗?

2 个答案:

答案 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; }
    }