使用BaseController

时间:2018-07-03 08:11:43

标签: asp.net asp.net-core-mvc asp.net-core-2.0

最近,我尝试使用ASP.NET Core 2.0创建MVC应用程序,并且在appsettings.json中定义了一些值,

"MySettings": {
"WebApiBaseUrl": "http://localhost:6846/api/"
}

为了读取这些值,我添加了

services.Configure<MySettingsModel>(Configuration.GetSection("MySettings"));

Startup.cs中ConfigureServices方法的上一行 并且在我的家庭控制器中添加了

private readonly IOptions<MySettingsModel> appSettings;
public HomeController(IOptions<MySettingsModel> app)
{
   appSettings = app;
}

MySettingsModel类只是一个模型,其属性与appsettings.json中的键定义相同。 通过这种方法,我可以读取此键的值。

现在我的问题是我想在许多控制器中使用此键,所以我不想在每个控制器中都重复此代码,所以我要做的是创建了一个BaseConntroller,添加了它的构造函数,然后在那里获取了值。但是,当我使用BaseController继承其他控制器时,它会抛出一个错误并告诉我生成其构造函数,因此基本上它告诉我在每个控制器中添加构造函数,这是我想要避免的。

我该如何实现?

您可以看到错误图片 This is the error that i get

这些是向我展示的潜在修补程序。

Potential fixes

1 个答案:

答案 0 :(得分:2)

这只是基本的C#继承。派生类必须在基类(至少是您想要或需要的类)上重新实现构造函数。唯一的例外是空的构造函数,它是隐式的。换句话说,您只需要:

public class HomeController : BaseController
{
    public HomeController(IOptions<MySettingsModel> app)
        : base(app)
    {
    }

当然,您需要将基类字段的可访问性更改为protected,而不是private。否则,派生类将无法访问它。

当然,这并不能为您节省太多。但是,这里没有免费的午餐。就像我说的那样,这是C#本身的局限性,因此您别无选择。值得一提的是,尽管有时这很烦人,但这实际上是C#的一种有用功能。您可以查看任何类,并确切地查看其可用的构造函数,而不必追溯其所有祖先。