c# – 使用BaseController的Asp.Net WebApi继承
发布时间:2020-12-16 02:04:16 所属栏目:百科 来源:网络整理
导读:我正在努力在WebApi中继续工作,就像我想的那样. 也许你可以指出我正确的方向? 我的目标是拥有一个通用的WebApi项目,该项目可以在多个其他WebApi项目中重用. 例如:我有一个可重用的UserController,可以处理多个WebSite的登录.现在我构建一个新的WebSite并简
我正在努力在WebApi中继续工作,就像我想的那样.
也许你可以指出我正确的方向? 我的目标是拥有一个通用的WebApi项目,该项目可以在多个其他WebApi项目中重用. 例如:我有一个可重用的UserController,可以处理多个WebSite的登录.现在我构建一个新的WebSite并简单地将UserController添加到新创建的项目中,这项工作很简单. 但是现在对新WebSite的要求发生了变化,我需要重载UserController方法以反映这些变化,而无需修改通用控制器. 我想要实现的内容可以在下面的代码片段中看到(当然这不会编译,因为C#抱怨不适合重载的方法.) // This belongs to solution "GenericWebApi" public class LoginRequest { public string User { get; set; } } public class BaseApiController : ApiController { [Route("login")] public virtual HttpResponseMessage Login(LoginRequest request) { return new HttpResponseMessage(); } } // This belongs to solution "CarWebsite" public class CarWebsiteLoginRequest : LoginRequest { public string Car { get; set; } } [RoutePrefix("api/users")] public class CarWebsiteApiController : BaseApiController { public override HttpResponseMessage Login(CarWebsiteLoginRequest request) { // Do some car specific login stuff return base.Login(request); } } 我发现一个解决方案是使用“动态”替换“LoginRequest”和“CarWebsiteLoginRequest”,但这感觉完全错误,而且ModelBinder当然不会按预期工作. 你有什么想法可以解决这个问题吗? 提前致谢 解决方法
您可以使BaseApiController通用:
public class BaseApiController<TLoginRequest> : ApiController where TLoginRequest : LoginRequest { [Route("login")] public virtual HttpResponseMessage Login(TLoginRequest request) { return new HttpResponseMessage(); } } 并使您的CarWebsiteApiController使用CarWebsiteLoginRequest作为通用参数: public class CarWebsiteApiController : BaseApiController<CarWebsiteLoginRequest> { public override HttpResponseMessage Login(CarWebsiteLoginRequest request) { // Do some car specific login stuff return base.Login(request); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |