我需要实现
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
这样的接口而不是所有泛型参数,并在派生类中使用实现,或者类似的东西?
要实现一个服务基类,该基类将成为具有 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 接口而不是所有泛型参数,并在派生类中使用实现。