Понимание наследования от базового класса контроллера - PullRequest
0 голосов
/ 15 января 2019

Я использую .NETCore 2.1, Entity Framework и страницы Razor для создания системы управления игрой.

У меня есть контроллер в пространстве имен Microsoft.AspNetCore.Mvc, который подключается и получает данные из API третьей части.

В контроллере есть несколько различных методов, которые возвращают разные вещи, но все они имеют общий общий код:

    public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo()
    {
        UserKey = "myAPIkey",
        Password = "xyzxyz"
    };

    public static GameSystemManager.GamerLister gamerLists = new GameSystemManager.GamerLister
    {
        MaxNumberResults = 15,
        PageNumber = 0
    };

Таким образом, один метод контроллера может выглядеть так:

    public IActionResult GetAllGames(Guid Id)
    {

        public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo()
        {
            UserKey = "myAPIkey",
            Password = "xyzxyz"
        };

        public static GameSystemManager.GamerLister gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = 15,
            PageNumber = 0
        };

        response = GameSystemManager.ListGames(gamerManagerLogin, gamerLists, Id);

        return View(response.Results);
    }

Поскольку несколько контроллеров и методов используют один и тот же код, я решил создать базовый контроллер и поместить туда этот код, а другие контроллеры наследовать от него.

Вот мой BaseController:

   public class BaseController : Controller
   {

        public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo()
        {
            UserKey = "myAPIkey",
            Password = "xyzxyz"
        };

        public static GameSystemManager.GamerLister gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = 15,
            PageNumber = 0
        };

    }

А вот как я это использую:

public class GameListController : BaseController
{

    public IActionResult GetAllGames(Guid Id)
    {

        response = GameSystemManager.ListGames(gamerManagerLogin, gamerLists, Id);

        return View(response.Results);
    }

}

Вот мой appsettings.json:

  "GamerManager": {
    "UserKey": "myAPIkey",
    "Password": "xyzxyz"
  },

Вот мой класс GamerManagerConfig:

public class GamerManagerConfig
{
    readonly string UserKey = "myAPIkey";
    readonly string Password = "xyzxyz";
}

Однако это не работает. Я просто получаю ошибку тайм-аута от API. Это только работает, когда у меня есть код непосредственно в методе контроллера, как мой пример выше.

Я думаю, что это как-то связано с инициализацией. Может быть, его нужно инициализировать прямо в методе? Я не уверен.

Любое понимание будет с благодарностью!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Ваша учетная информация должна быть во внешней конфигурации (пользовательские секреты, переменные среды, хранилище ключей Azure и т. Д.), И вы должны затем внедрить ее в свои контроллеры. Максимальные результаты и номер страницы также должны быть либо во внешней конфигурации, либо предоставлены в качестве параметров вашего действия (если вы хотите иметь возможность настроить его с помощью запроса).

Создать класс как:

public class GamerManagerConfig
{
    UserKey = "myAPIkey",
    Password = "xyzxyz"
}

Свяжите свою конфигурацию с этим в Startup.cs:

services.Configure<GamerManagerConfig>(Configuration.GetSection("GamerManager"));

Тогда в вашем контроллере:

public class GameListController : Controller
{
    private readonly GamerManagerConfig _gamerManagerConfig;

    public GameListController(IOptions<GamerManagerConfig> gamerManagerConfig)
    {
        _gamerManagerConfig = gamerManagerConfig.Value;
    }

    public IActionResult GetAllGames(Guid id, page = 1, maxResults = 15)
    {
        var gamerManagerLogin = new GameSystemManager.LoginInfo
        {
            UserKey = _gamerManagerConfig.UserKey,
            Password = _gamerManagerConfig.Password
        };

        var gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = maxResults,
            PageNumber = page
        };

        var response = GameSystemManager.ListGames(gamerManagerLogin, gamerLists, id);

        return View(response.Results);
    }
}
0 голосов
/ 15 января 2019

Попробуйте следующий код. Я подозреваю, что ваши статические методы связаны с BaseController.

статические методы - это, по сути, метод возврата к объектно-ориентированному концепции. Как следствие, они не очень гибки в наследовании иерархии, и это невозможно сделать напрямую.

response = GameSystemManager.ListGames(BaseController.gamerManagerLogin, BaseController.gamerLists, Id);

В качестве альтернативы вы можете создать конструктор в вашем BaseController. Когда вы вызываете конструктор Base из вашего GameListController, он может инициализировать объекты GameSystemManager с правильными значениями. Затем вы можете получить доступ к свойствам из базового класса. Ссылка на пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...