于是,我为List<string>到特定对象的转换操作也定义一个抽象:
public interface IConverter |
在这里,我为每个字段定义了一种转化器(而在实际开发过程中,我们可能也会为“每种类型”定义一个)。每个转化器对象均可独立的进行单元测试,其中复杂的边界条件,错误判断等等都是测试的目标。待几种转换器测试完毕,我们便可以重构SerachCriteriaBinder的Build方法:
private SearchCriteria Build(List<string[]> tokenGroups) { var fieldTokens = tokenGroups.ToDictionary( g => g[0].ToLowerInvariant(), g => g.Skip(1).ToList()); var searchCriteria = new SearchCriteria(); List<string> values; if (fieldTokens.TryGetValue("keywords", out values)) { searchCriteria.Keywords = (string)this.GetConverter("keywords").Convert(values); } if (fieldTokens.TryGetValue("price", out values)) { searchCriteria.Price = (PriceRange)this.GetConverter("price").Convert(values); } if (fieldTokens.TryGetValue("color", out values)) { searchCriteria.Colors = (Color)this.GetConverter("color").Convert(values); } return searchCriteria; } private IConverter GetConverter(string field) { // 使用if ... else或是字典 } |