c# – 使用BaseController的Asp.Net WebApi继承

我正在努力在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);
    }
}

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...