最近,我尝试使用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继承其他控制器时,它会抛出一个错误并告诉我生成其构造函数,因此基本上它告诉我在每个控制器中添加构造函数,这是我想要避免的。
我该如何实现?
这些是向我展示的潜在修补程序。
答案 0 :(得分:2)
这只是基本的C#继承。派生类必须在基类(至少是您想要或需要的类)上重新实现构造函数。唯一的例外是空的构造函数,它是隐式的。换句话说,您只需要:
public class HomeController : BaseController
{
public HomeController(IOptions<MySettingsModel> app)
: base(app)
{
}
当然,您需要将基类字段的可访问性更改为protected
,而不是private
。否则,派生类将无法访问它。
当然,这并不能为您节省太多。但是,这里没有免费的午餐。就像我说的那样,这是C#本身的局限性,因此您别无选择。值得一提的是,尽管有时这很烦人,但这实际上是C#的一种有用功能。您可以查看任何类,并确切地查看其可用的构造函数,而不必追溯其所有祖先。