2013-04-09 45 views
2

我实现了一个自定义IContractResolver,以便可以从Web API动态过滤出对象上的某些属性。例如,操作GetEmployees将过滤掉每个退回的员工的“Id”属性。Web API自定义IContractResolver

public IEnumerable<Employee> GetEmployees() 
{ 
    var ignoreList = new List<string> {"Id"}; 
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new JsonContractResolver(ignoreList); 
    return db.Employees.AsEnumerable(); 
} 

问题是,在同样的方法中,我想将合约解析器设置回其默认值。类似这样的:

public IEnumerable<Employee> GetEmployees() 
{ 
    var defaultContractResolver = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver; 
    var ignoreList = new List<string> {"Id"}; 
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new JsonContractResolver(ignoreList); 
    // Serialize object 
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = defaultContractResolver; 
    // return serialized object 
} 

实现此目的的最佳方法是什么?

回答

2

这绝对不是您尝试它的方式。你将以这种方式运行线程问题。

一种方法可能是将您返回的对象更改为不包含Id属性。取而代之的是制作更专业的物体这是我的方式。

或者,您可以直接返回HttpResponseMessage并将内容设置为任何您喜欢的内容。但是你必须自己处理序列化和内容否定。

+0

因此,循环访问数据库中请求的员工并创建要返回的专用对象的新列表? – 2013-04-09 13:16:20

+2

是的。特殊情况下的特殊数据对象。就个人而言,我不是直接返回数据库对象的粉丝(不管他们是否是POCO),我将这些对象从DTO对象中分离出来。 – JustAnotherUserYouMayKnow 2013-04-09 13:28:24