c# - Asp.Net WebApi 继承与 BaseController

标签 c# asp.net .net asp.net-web-api asp.net-web-api2

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

相关文章:

c# - .NET Windows Forms 应用程序是否可以在 64 位操作系统中运行或是否需要修改?

C# 执行 Dos 并在完成时通知

c# - 修剪 ASP.NET 超链接变量

c# - 使用 Netwonsoft 库序列化 JSON 时如何按字母顺序对属性进行排序?

asp.net - 为什么只有在属性验证通过时才调用 IValidatableObject.Validate?

javascript - 如果显示隐藏的 Div,则禁用单选按钮

c# - 为什么我的属性(property)不做检查?

c# - 异步方法在多个图像上传上首次运行失败

c# - WebControl 和 IDisposable

c# - 如何在 ASP.NET C# 中的新选项卡(而不是窗口)中打开页面?