Проблема внедрения зависимостей приложений ASP.NET Core MVC при использовании BaseController - PullRequest
0 голосов
/ 03 июля 2018

Недавно я попытался создать приложение MVC, используя ASP.NET Core 2.0, и у меня были некоторые значения, определенные в appsettings.json,

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

Чтобы прочитать эти значения, я добавил

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

над строкой в ​​методе ConfigureServices в Startup.cs и в моем домашнем контроллере я добавил

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 голосов
/ 03 июля 2018

Это просто базовое наследование C #. Производные классы должны повторно реализовывать конструкторы на базовых классах (по крайней мере, тех, которые вам нужны или нужны). Единственным исключением является пустой конструктор, который является неявным. Другими словами, вам просто нужно:

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

И, конечно, вам нужно изменить доступность поля базового класса на protected вместо private. В противном случае производные классы не смогут получить к нему доступ.

Конечно, это не так сильно тебя спасает. Тем не менее, здесь нет бесплатного обеда. Как я уже сказал, это ограничение самого C #, поэтому у вас нет выбора. Хотя стоит отметить, что, хотя иногда это может раздражать, на самом деле это своего рода полезная функция C #. Вы можете посмотреть на любой класс и увидеть, какие конструкторы у него есть, без необходимости отследить всех его предков.

...