coa*_*mee 3 .net c# asp.net asp.net-web-api asp.net-web-api2
我正在努力在WebApi中继续工作,就像我想的那样.也许你可以指出我正确的方向?
我的目标是拥有一个通用的WebApi项目,该项目可以在多个其他WebApi项目中重用.
例如:我有一个可重用的UserController,可以处理多个WebSites的登录.现在我构建一个新的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);
}
}
Run Code Online (Sandbox Code Playgroud)
我发现一个解决方案是使用"动态"替换"LoginRequest"和"CarWebsiteLoginRequest",但这感觉完全错误,而ModelBinder当然不会按预期工作.
你有什么想法可以解决这个问题吗?
提前致谢
你可以制作BaseApiController通用的:
public class BaseApiController<TLoginRequest> : ApiController
where TLoginRequest : LoginRequest
{
[Route("login")]
public virtual HttpResponseMessage Login(TLoginRequest request)
{
return new HttpResponseMessage();
}
}
Run Code Online (Sandbox Code Playgroud)
使您的CarWebsiteApiController使用CarWebsiteLoginRequest作为一个通用的参数:
public class CarWebsiteApiController : BaseApiController<CarWebsiteLoginRequest>
{
public override HttpResponseMessage Login(CarWebsiteLoginRequest request)
{
// Do some car specific login stuff
return base.Login(request);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11301 次 |
| 最近记录: |