轻松便捷地实施定制服务

问题描述 投票:0回答:1

我需要实现

Service
基类,它将成为具有 3 个请求的 MVC API 控制器
Check
Pay
PayStatus
。每个请求和响应都有其基本属性,以及作为通用类的附加参数,可单独用于每个服务。

例子:

public class CheckRequest<TParams>
{
    public decimal Amount { get; set; }
    public string AccountId { get; set; }
    public TParams? AdditionalParams { get; set; }
}

public class TestServiceCheckRequest : CheckRequest<TestServiceCheckReuestParams> {}

我想出了这样的东西。

/// <typeparam name="T1">Check Request Params</typeparam>
/// <typeparam name="T2">Check Response Params</typeparam>
/// <typeparam name="T3">Pay Request Params</typeparam>
/// <typeparam name="T4">Pay Response Params</typeparam>
/// <typeparam name="T5">Payment Status Request Params</typeparam>
/// <typeparam name="T6">Payment Status Response Params</typeparam>
[ApiController]
[Route("[controller]/[action]")]
public abstract class Service<T1, T2, T3, T4, T5, T6> : ControllerBase
{
    [HttpPost]
    public abstract Task<CheckResponse<T1>> Check(CheckRequest<T2> request);
    [HttpPost]
    public abstract Task<CheckResponse<T3>> Pay(CheckRequest<T4> request);
    [HttpPost]
    public abstract Task<CheckResponse<T5>> Paystatus(CheckRequest<T6> request);
}

但是这个带有 6 个通用参数的解决方案似乎不太方便,我正在寻找另一种解决方案。 有没有办法在基类中使用像

IServiceParams
这样的接口而不是所有泛型参数,并在派生类中使用实现,或者类似的东西?

c# asp.net-apicontroller
1个回答
0
投票

要实现一个服务基类,该基类将成为具有 3 个请求 Check、Pay 和 PayStatus 的 MVC API 控制器,您可以使用以下代码结构。

public class CheckRequest<TParams>
{
    public decimal Amount { get; set; }
    public string AccountId { get; set; }
    public TParams? AdditionalParams { get; set; }
}

public class TestServiceCheckRequest : CheckRequest<TestServiceCheckReuestParams> {}

[ApiController]
[Route("[controller]/[action]")]
public abstract class Service : ControllerBase
{
    [HttpPost]
    public abstract Task<CheckResponse<T1>> Check<T1, T2>(CheckRequest<T2> request) where T1 : class where T2 : class;
    [HttpPost]
    public abstract Task<CheckResponse<T3>> Pay<T3, T4>(CheckRequest<T4> request) where T3 : class where T4 : class;
    [HttpPost]
    public abstract Task<CheckResponse<T5>> Paystatus<T5, T6>(CheckRequest<T6> request) where T5 : class where T6 : class;
}

您可以在基类中使用 IServiceParams 接口而不是所有泛型参数,并在派生类中使用实现,如下所示:

public interface IServiceParams { }

public class CheckRequest<TParams> where TParams : IServiceParams
{
    public decimal Amount { get; set; }
    public string AccountId { get; set; }
    public TParams? AdditionalParams { get; set; }
}

public class TestServiceCheckRequest : CheckRequest<TestServiceCheckReuestParams> { }

public interface ICheckServiceParams : IServiceParams { }

public interface IPayServiceParams : IServiceParams { }

public interface IPayStatusServiceParams : IServiceParams { }

[ApiController]
[Route("[controller]/[action]")]
public abstract class Service : ControllerBase
{
    [HttpPost]
    public abstract Task<CheckResponse<T1>> Check<T1, T2>(CheckRequest<T2> request) where T1 : class where T2 : ICheckServiceParams;
    [HttpPost]
    public abstract Task<CheckResponse<T3>> Pay<T3, T4>(CheckRequest<T4> request) where T3 : class where T4 : IPayServiceParams;
    [HttpPost]
    public abstract Task<CheckResponse<T5>> Paystatus<T5, T6>(CheckRequest<T6> request) where T5 : class where T6 : IPayStatusServiceParams;
}

通过此实现,您可以在基类中使用 IServiceParams 接口而不是所有泛型参数,并在派生类中使用实现。

© www.soinside.com 2019 - 2024. All rights reserved.