洞悉从基本控制器类继承

时间:2019-01-15 17:29:38

标签: razor asp.net-core entity-framework-6 asp.net-core-mvc

我正在使用.NETCore 2.1,实体框架和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 :(得分:1)

尝试以下代码。我怀疑您的静态方法是链接到BaseController的。

  

静态方法基本上是一种从面向对象回退的方法   概念。结果,它们在继承方面不是很灵活   层次结构,不可能直接做这样的事情。

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

或者,您可以在BaseController中创建一个构造函数。当您从GameListController调用Base构造函数时,它可以使用正确的值初始化GameSystemManager对象。然后,您可以从基类访问属性。 Link to example

答案 1 :(得分:1)

您的登录信息应位于外部配置(用户密码,环境变量,Azure Key Vault等)中,然后应将其注入到控制器中。最大结果和页码也应该在外部配置中,或者作为操作的参数提供(如果您希望能够通过请求进行自定义)。

创建一个类似的类:

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);
    }
}