当我进行开发时,我通常会尝试遵循SOLID原则。通常,您有一个接口,所有受影响的类都会实现该接口,然后在进行进一步计算时将该接口用作参数。
我的问题是,在调用web服务时,如何实现这一点?下面的代码不是很精简,也不符合单一责任模式和开放/关闭原则。
如何重新设计以下代码以遵循SRP和O/C:
public class Fetch
{
public void Run()
{
var url = "https://api.nasa.gov/planetary/apod?api_key=NNKOjkoul8n1CH18TWA9gwngW1s1SmjESPjNoUFo";
var client = new HttpClient();
var response = client.GetAsync(url).Result;
var data = response.Content.ReadAsStringAsync().Result;
var parsedData = JsonConvert.DeserializeObject<Nasa>(data);
if(parsedData.media_type.Equals("image"))
{
CreateImage(parsedData);
}
if (parsedData.media_type.Equals("video"))
{
CreateVideo(parsedData);
}
if (parsedData.media_type.Equals("text"))
{
CreateText(parsedData);
}
}
}
public class Nasa
{
public string copyright { get; set; }
public string date { get; set; }
public string explanation { get; set; }
public string hdurl { get; set; }
public string media_type { get; set; }
public string service_version { get; set; }
public string title { get; set; }
public string url { get; set; }
}( Api密钥取自美国国家航空航天局的示例站点,所以不用担心它会暴露出来。使用.Result的异步部分仅用于此示例)
发布于 2016-04-14 19:42:08
在不太了解您的需求或CreateVideo(item)和CreateImage(item)如何工作的情况下,您可以将此作为起点。
请注意,如果您正在使用依赖项容器(如Simple Injector,我喜欢它!)以下内容中的大部分依赖项都可以由容器提供。
public class Nasa
{
public string copyright { get; set; }
public string date { get; set; }
public string explanation { get; set; }
public string hdurl { get; set; }
public string media_type { get; set; }
public string service_version { get; set; }
public string title { get; set; }
public string url { get; set; }
}
public interface ITransformFetch<in T>
{
void Transform(T data);
}
public interface IFetch<T>
{
T Fetch();
}
public class NasaFetcher : IFetch<Nasa>
{
private const string NasaUrl = "https://api.nasa.gov/planetary/apod?api_key=NNKOjkoul8n1CH18TWA9gwngW1s1SmjESPjNoUFo";
private readonly IHttpClientWrapper _client;
public NasaFetcher(IHttpClientWrapper client)
{
_clientFactory = client;
}
public Nasa Fetch()
{
var response = _client.GetAsync(NasaUrl).Result;
var data = response.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<Nasa>(data);
}
}
public class NasaFetchImageTransformer : ITransformFetch<Nasa>
{
public void Transform(Nasa data)
{
// transform data
}
}
public class NasaFetchVideoTransformer : ITransformFetch<Nasa>
{
public void Transform(Nasa data)
{
// transform data
}
}
public class NasaFetcherTransformerDecorator : IFetch<Nasa>
{
private readonly IFetch<Nasa> _fetcher;
public NasaFetcherTransformerDecorator(IFetch<Nasa> fetcher)
{
_fetcher = fetcher;
}
public Nasa Fetch()
{
var result = _fetcher.Fetch();
if (result != null)
{
switch (result.media_type)
{
case "image":
var nasaFetchImageTransformer = new NasaFetchImageTransformer();
nasaFetchImageTransformer.Transform(result);
break;
case "video":
var nasaFetchVideoTransformer = new NasaFetchVideoTransformer();
nasaFetchVideoTransformer.Transform(result);
break;
}
}
return result;
}
}
public class Test
{
public void TestNasaFetcher()
{
var data = new NasaFetcherTransformerDecorator(new NasaFetcher(new HttpClientWrapper()));
var nasa = data.Fetch();
}
}https://stackoverflow.com/questions/36621315
复制相似问题