Razor 深入了解从基本控制器类继承
我正在使用.netcore2.1、实体框架和Razor页面创建一个游戏管理系统 我在Microsoft.AspNetCore.Mvc命名空间中有一个控制器,它连接到第三方API并从中检索数据 控制器有许多不同的方法返回不同的内容,但它们都共享以下代码:Razor 深入了解从基本控制器类继承,razor,asp.net-core,entity-framework-6,asp.net-core-mvc,Razor,Asp.net Core,Entity Framework 6,Asp.net Core Mvc,我正在使用.netcore2.1、实体框架和Razor页面创建一个游戏管理系统 我在Microsoft.AspNetCore.Mvc命名空间中有一个控制器,它连接到第三方API并从中检索数据 控制器有许多不同的方法返回不同的内容,但它们都共享以下代码: public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo() { UserKey =
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 : 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);
}
}
下面是我如何使用它:
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"
},
这是我的GamerManager配置类:
public class GamerManagerConfig
{
readonly string UserKey = "myAPIkey";
readonly string Password = "xyzxyz";
}
但是,它不起作用。我刚从API中得到一个超时错误。它只在控制器方法中直接包含代码时才起作用,就像上面的示例一样
我认为这可能与初始化有关。可能需要在方法中直接初始化它?我不确定
任何洞察都将不胜感激
谢谢 请尝试以下代码。我怀疑您的静态方法链接到BaseController 静态方法基本上是一种从面向对象后退的方法 概念。因此,它们在继承方面不是很灵活 层次结构,不可能直接做这样的事情
或者,您可以在BaseController中创建构造函数。当您从GameListController调用基本构造函数时,它可以使用正确的值初始化GameSystemManager对象。然后可以从基类访问属性 请尝试以下代码。我怀疑您的静态方法链接到BaseController 静态方法基本上是一种从面向对象后退的方法 概念。因此,它们在继承方面不是很灵活 层次结构,不可能直接做这样的事情
或者,您可以在BaseController中创建构造函数。当您从GameListController调用基本构造函数时,它可以使用正确的值初始化GameSystemManager对象。然后可以从基类访问属性 您的登录信息应该在外部配置(用户机密、环境变量、Azure密钥库等)中,然后您应该将其注入控制器。最大结果和页码也应该在外部配置中,或者作为操作的参数提供(如果您希望能够通过请求对其进行自定义) 创建一个类,如:
public class GamerManagerConfig
{
UserKey = "myAPIkey",
Password = "xyzxyz"
}
将您的配置绑定到Startup.cs中:
services.Configure<GamerManagerConfig>(Configuration.GetSection("GamerManager"));
services.Configure(Configuration.GetSection(“GamerManager”);
然后,在控制器中:
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 : 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);
}
}
公共类GameListController:控制器
{
私有只读GamerManager配置_GamerManager配置;
公共GameListController(IOptions GamerManager配置)
{
_GamerManager配置=GamerManager配置.Value;
}
public IActionResult GetAllGames(Guid id,第1页,maxResults=15)
{
var gamerManagerLogin=new GameSystemManager.LoginInfo
{
UserKey=\u gamerManagerConfig.UserKey,
Password=\u gamerManagerConfig.Password
};
var gamerLists=new GameSystemManager.GamerLister
{
MaxNumberResults=maxResults,
页码=第页
};
var response=GameSystemManager.ListGames(GamerManager登录,GamerList,id);
返回视图(response.Results);
}
}
您的登录信息应该在外部配置中(用户机密、环境变量、Azure密钥库等),然后您应该将其注入控制器。最大结果和页码也应该在外部配置中,或者作为操作的参数提供(如果您希望能够通过请求对其进行自定义)
创建一个类,如:
public class GamerManagerConfig
{
UserKey = "myAPIkey",
Password = "xyzxyz"
}
将您的配置绑定到Startup.cs中:
services.Configure<GamerManagerConfig>(Configuration.GetSection("GamerManager"));
services.Configure(Configuration.GetSection(“GamerManager”);
然后,在控制器中:
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 : 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);
}
}
公共类GameListController:控制器
{
私有只读GamerManager配置_GamerManager配置;
公共GameListController(IOptions GamerManager配置)
{
_GamerManager配置=GamerManager配置.Value;
}
public IActionResult GetAllGames(Guid id,第1页,maxResults=15)
{
var gamerManagerLogin=new GameSystemManager.LoginInfo
{
UserKey=\u gamerManagerConfig.UserKey,
Password=\u gamerManagerConfig.Password
};
var gamerLists=new GameSystemManager.GamerLister
{
MaxNumberResults=maxResults,
页码=第页
};
var response=GameSystemManager.ListGames(GamerManager登录,GamerList,id);
返回视图(response.Results);
}
}
发布不起作用的代码可能比发布起作用的代码更有帮助!谢谢我加了底座controller@Loofer我还添加了使用基本控制器的方式。您的登录信息应该在外部配置(用户机密、环境变量、Azure密钥库等)中,然后您应该将其注入控制器。包含页码和最大结果的静态也不应该是静态的。Max results也可能在您的配置中,而页码根本不应该在那里,而是应该来自请求。@ChrisPratt谢谢,但我只是从我的Razor页面中点击控制器。我该如何传递这些信息?再次感谢。也许发布不起作用的代码比发布不起作用的代码更有帮助!谢谢我加了底座controller@Loofer我还添加了使用基本控制器的方式。您的登录信息应该在外部配置(用户机密、环境变量、Azure密钥库等)中,然后您应该是injec