基于Json.NET自己实现MVC中的JsonValueProviderFactory2015-06-17写了博文ASP.NET MVC 3升级至MVC 5.1的遭遇:“已添加了具有相同键的项”之后,继续看着System.Web.Mvc.JsonValueProviderFactory的开源代码。越看越不顺眼,越看心里越不爽!不爽的地方主要有两个:1)依然在使用用性能低下且不开源的JavaScriptSerializer!打死也不用Json.NET!2)作为一个工厂类,JsonValueProviderFactory实现复杂,而且工厂生产出的产品DictionaryValueProvider(IValueProvider的一个实现)也很复杂。【先看第一个不爽】JsonValueProviderFactory的工作之一是对json字符串进行反序列化,而Json.NET的反序列化性能远超JavaScriptSerializer,请看下图:

而微软MVC开发人员依然不思进取,用自家东西的痴心不改,继续用着JavaScriptSerializer。
private static object GetDeserializedObject(ControllerContext controllerContext){//...JavaScriptSerializer serializer = new JavaScriptSerializer();object jsonData = serializer.DeserializeObject(bodyText);return jsonData;}仅凭这一点,就让我产生了这样的冲动——基于Json.NET自己实现一个JsonValueProviderFactory。【再看第二个不爽】作为一个工厂类,JsonValueProviderFactory继承自ValueProviderFactory,重载了ValueProviderFactory的抽象方法GetValueProvider,返回接口IValueProvider的一个实现。(ControllerActionInvoker就是通过IValueProvider接口根据key得到Action各个参数的值)IValueProvider的代码如下:
namespace System.Web.Mvc{public interface IValueProvider{bool ContainsPrefix(string prefix);ValueProviderResult GetValue(string key);}}接口很简单,先检查prefix是否存在,如果存在通过key取值。JsonValueProviderFactory返回的DictionaryValueProvider就是干这个活的,但是为了生产DictionaryValueProvider,JsonValueProviderFactory进行了复杂的搬箱子操作,不仅用到了递归,而且还用了多个IDictionary<string, object>,代码让人看得头晕。再看看DictionaryValueProvider的实现,也是复杂,而且还用到了PrefixContainer。简单算个账:JsonValueProviderFactory的代码用了120行,DictionaryValueProvider的代码用了63行,PrefixContainer的代码用了219,一共用了402行代码(包含空行与命名空间的引用)。有些奢侈!需要这么复杂吗?有更简单的解决方法吗?