【问题标题】:How do I tell RavenDB to ignore a property but not WebAPI?如何告诉 RavenDB 忽略属性而不是 WebAPI?
【发布时间】:2013-01-06 03:49:40
【问题描述】:

我有一个不想存储在 RavenDB 中的属性。如果我添加 JsonIgnore 属性,RavenDB 会很好地忽略,但 WebApi 也会如此。不过,我仍然希望 WebApi 将数据序列化到 Web 客户端。

如何告诉 RavenDB 忽略一个属性但仍然让 WebApi 序列化它?

【问题讨论】:

    标签: asp.net-web-api json.net ravendb


    【解决方案1】:

    在 RavenDB 2.0 中

    using Raven.Imports.Newtonsoft.Json
    
    public class Foo
    {
        [JsonIgnore]
        public string Bar { get; set; }
    }
    

    因为它使用 raven 的 json.net 内部化副本 - WebApi 不会获取该属性。

    在 RavenDB 1.0 2.0

    您可以使用自定义 json 合约解析器直接自定义对象的 json 序列化。

    public class CustomContractResolver : DefaultRavenContractResolver
    {
        public CustomContractResolver(bool shareCache) : base(shareCache)
        {
        }
    
        protected override List<MemberInfo> GetSerializableMembers(Type objectType)
        {
            var members = base.GetSerializableMembers(objectType);
    
            if (objectType == typeof(Foo))
                members.RemoveAll(x => x.Name == "Baz");
    
            return members;
        }
    }
    

    在初始化时将其连接到您的文档存储:

    documentStore.Conventions.JsonContractResolver = new CustomContractResolver(true);
    documentStore.Initialize();
    

    因为它没有连接到其他任何地方,它只会影响 RavenDB。随心所欲地自定义它以满足您的需求。

    【讨论】:

    • [Raven.Imports.Newtonsoft.Json.JsonIgnore] 就成功了。我现在可以控制哪些属性与 WebAPI 分开序列化到 RavenDB。这个答案的第二部分有什么需要/好处?
    • Raven 1.0 仍然存在。许多人不喜欢用属性污染他们的实体。
    • 谢谢,合同解析器让我不必实际使用良好的软件架构;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多