【发布时间】:2019-06-03 17:52:40
【问题描述】:
我需要统一几个具有相同目的但使用相同方法但参数和结果不同的类。
你可能听起来很奇怪,所以让我解释一下。
我有多个类连接到多个 rest/web 服务以从中获取数据。对于这个例子,假设所有这些都是天气预报服务。每个人都做同样的事情。一些地区的回报预测,但他们都在按照自己的方式做。对于每个服务,我都有实现从中收集数据并映射到我的对象的类:
public class AForecast
{
public AForecastResult GetForecast (AForecastRequest request)
{
// Grab Forecast
}
}
public class BForecast
{
public BForecastResult GetForecast (BForecastRequest request)
{
// Grab Forecast
}
}
我正在调用这些类,获取预测数据,然后将其映射到我自己使用的对象中,这很好。我的问题是,现在我有 13 个预测服务。他们中的许多人正在使用类似的方法将预测结果映射到我自己的对象中。下一个问题也是,现在可能只有我知道如何将新预测添加到系统中。我想统一一下,以便能够在 Forecast 服务实现中添加一些接口,以及一些基本预测映射器。
我创建了接口,但由于我不知道预测结果和请求看起来如何,它看起来非常通用:
public interface IForecast<out TResult, in TRequest>
{
TResult GetForecast(TReqiest request)
}
对于每个预测,我创建了单独的接口来实现IForecast
public interface IAForecast : IForecast<AForecastResult, AForecastRequest>
{
}
我的AForecast 实现开始看起来像这样:
public class AForecast : IAForecast
{
public AForecastResult GetForecast (AForecastRequest request)
{
// Grab Forecast
}
}
多亏了我拥有自己的接口和通用基本接口的预测服务。
问题是当我想在基类中使用它时,它将能够调用每个预测服务和地图对象:
public abstract ForecastBase
{
private readonly ?ForecastService _service;
protected ForecastBase(?ForecastService service)
{
_service = service;
}
public MapedObject GetForecast(DateTime date, string zip)
{
var request = GetRequest(date,zip);
var forecastServiceResponse = _service.GetForecast(request);
return Map(forecastServiceResponse);
}
protected abstract MapedObject Map(?Response response);
protected abstract ?Request GetRequest(DateTime date, string zip);
}
哦,这很长。现在最后一个问题如何实现ForeCast 基类?根据我的架构,我怎么知道?ForecastService、?Request 和?Response 的类型。我希望我可以制作这样的映射器:
public class AMap : ForecastBase
并且知道在这种情况下?ForecastService 将是IAForecast,?Request 将是AForecastRequest 和?Response 将是AForecastResponse?
如果您需要更多解释,请随时询问。
【问题讨论】:
-
您能发布您的
ForecastResult和ForecastRequest类/接口吗? -
我不能,这取决于预测服务。可以是包含XML的字符串,也可以是包含JSON的字符串,也可以是
wsdl文件的类形式。这取决于服务。他们中很少有人返回XElement -
我不能,因为我不知道,不是因为我不想说。
-
我的意思是,你能显示请求/结果的接口和类定义吗?如果您认为此处太大,也可以将其复制到 pastebin。
-
在这种情况下,
AForecastRequest是一个仅包含区域(邮政编码)的字符串,而对于AForecastResult,我得到了具有温度和湿度的字符串列表。对于BForecastRequest,我需要创建他们的.wsdl对象并用zone、date和key填充以进行身份验证,对于BForecastResult,我得到了.wsdl对象,其中包含temperature的预测列表、forecast、opionion和tip。它们彼此不相关。而那些对象没有自己的接口,我也没有把它包裹在自己的接口中
标签: c# generics abstract-class