我目前正在努力让 WebApi 中的继承像我想要的那样工作。 也许你能给我指出正确的方向?
我的目标是拥有一个通用的 WebApi 项目,它可以在多个其他 WebApi 项目中重复使用。
例如:我有一个可重用的 UserController,它可以处理多个网站的登录。现在我构建了一个新的 WebSite,并将 UserController 添加到新创建的项目中,这很简单。
但现在新网站的要求发生了变化,我需要重载 UserController 方法以反射(reflect)这些变化,而无需修改通用 Controller 。
我想要实现的可以在下面的代码片段中看到(当然这不会编译,因为 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”替换为“dynamic”,但这感觉完全错误,而且 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);
}
}
关于c# - Asp.Net WebApi 继承与 BaseController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27964179/