代码之家  ›  专栏  ›  技术社区  ›  SkyeBoniwell

从基本控制器类继承的洞察力

  •  0
  • SkyeBoniwell  · 技术社区  · 6 年前

    我正在使用.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);
        }
    

    由于多个控制器和方法使用相同的代码,我决定创建一个基本控制器,并将该代码放在其中,并让其他控制器从中继承。

    这是我的基站控制器:

       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中得到一个超时错误。它 只有 当我直接在controller方法中使用代码时工作,如上面的示例。

    我认为这可能与初始化有关。可能需要在方法中直接初始化它?我不确定。

    任何洞察都将不胜感激!

    谢谢!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Chris Pratt    6 年前

    您的登录信息应该在外部配置中(用户机密、环境变量、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);
        }
    }
    
        2
  •  1
  •   eVolve    6 年前

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

    静态方法基本上是一种从面向对象回退的方法 概念。因此,它们在继承上不是很灵活 等级制度,不可能直接做这种事。

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

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