gpt4 book ai didi

c# - Asp.Net WebApi 继承与 BaseController

转载 作者:行者123 更新时间:2023-11-30 14:09:40 25 4
gpt4 key购买 nike

我目前正在努力让 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com