我正在使用.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收到超时错误。像上面的示例一样,当我直接在控制器方法中拥有代码时,它仅有效。
我认为这可能与初始化有关。也许需要直接在方法中初始化它?我不确定。
任何见识将不胜感激!
谢谢!
答案 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);
}
}