我有一个相当琐碎的WebAPI,它从另一个Webservice返回一个结果。
[HttpGet]
public List<MyList> GetResults()
{
var result = Webservice.GetResults().ToList();
return result;
}上面的内容返回来自Webservice调用的所有值,并且具有相同的道具名称。
我的问题是,如何从WebService获取数据,用自己的数据扩展一些数据,更改一些道具名称,然后返回新的结果?而不使用Automapper或类似的组件?
[HttpGet]
public List<MyList> GetResults()
{
var result = Webservice.GetResults().ToList();
foreach (res in results) {
var newTitle = result.Title + " - my custom value";
var newData = "01/01/2019";
var newLink = GetCustomLink(result);
}
return newValues;
} 发布于 2019-02-01 08:25:33
可以使用Linq的创建自定义结果。
var result = Webservice.GetResults().ToList();
return result.Select( s => new MyList{
newTitle = result.Title + " - my custom value",
newData = "01/01/2019",
newLink = GetCustomLink(result)
});发布于 2019-02-01 08:15:11
在许多应用程序/API中,您讨论的是一个常见的场景。
如果你是从工程学的角度来看待这个问题,那么我会这样做:
使用函数方法从控制器调用该类。
我的意思是,您的翻译层将不了解任何外部API,它只知道它将以特定的格式接收一些数据,它将转换它并返回结果,仅此而已。这使得测试变得非常容易,因为您可以任意注入数据,并测试发生的事情,而不必模拟任何事情。
就像这样:
[HttpGet]
public List<MyApiDataDto> GetResults()
{
List<ApiSourceDataDto> externalApiResults = Webservice.GetResults().ToList();
List<MyApiDataDto> myResults = new TranslationLayer().Translate(externalApiResults)
return myResults;
}在一个单独的类库中,假设您有如下内容:
public class TranslationLayer{
public List<MyApiDataDto> Translate(List<ApiSourceDataDto> input)
{
//apply your business logic and transformations here.
//return the transformed data.
}
}现在您有了SOC (分离关注点),并且可以开始围绕您的翻译方法进行一些适当的测试。您的控制器很简单,没有太多的代码,这是应该的。你想要瘦而不是胖的控制器。
当然,这只是给你一个初步的想法。如果您有很多翻译方法,那么您需要以一种对您的应用程序有意义的方式进行分离。一定要保持独立和任何业务逻辑以外的控制器。
当然,您还会添加一些代码来处理外部API返回的错误。
发布于 2019-02-01 08:23:47
您还可以使用LINQ方法,例如:
[HttpGet]
public List<MyList> GetResults()
{
var result = Webservice.GetResults().ToList();
return results.Select(xx=> new MyList{ // ,-- HERE YOU CAN ALSO USE A GENERIC NEW
newTitle = result.Title + " - my custom value",
newData = "01/01/2019",
newLink = GetCustomLink(result)
}).ToList()
} ..。然后..。如果这个映射是循环的..。您可以创建一个扩展方法来执行以下操作:
public static MyList ToMyCustomType(this YOURWSTYPE input){
return new MyList{
newTitle = result.Title + " - my custom value",
newData = "01/01/2019",
newLink = GetCustomLink(result)
}
}
public static List<MyList> ToMyCustomType(this IEnumerable<YOURWSTYPE> input){
return input.Select(xx=> xx.ToMyCustomType()).ToList();
}..。然后你就可以像这样:
[HttpGet]
public List<MyList> GetResults()
{
return Webservice.GetResults().ToList().ToMyCustomType();
} 希望它能帮你!!
https://stackoverflow.com/questions/54475102
复制相似问题