# Nest: Add a custom ContractResolver

**URL:** <https://discuss.elastic.co/t/nest-add-a-custom-contractresolver/58935>\
**Category:** Elasticsearch\
**Created:** [August 25, 2016, 1:39pm UTC](https://discuss.elastic.co/t/nest-add-a-custom-contractresolver/58935 "2016-08-25T13:39:21Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Denis\_Lamanov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/denis_lamanov/32/13111_2.png) [@Denis\_Lamanov](https://discuss.elastic.co/u/Denis_Lamanov)\
**Post date:** [August 25, 2016, 1:39pm UTC](https://discuss.elastic.co/t/nest-add-a-custom-contractresolver/58935/1 "2016-08-25T13:39:21Z")

</div>

Hi guys,

How can I add a custom ContractResolver in order prevent calling default constructor?

Tried to do this, but it does not work:

```
public class MyJsonNetSerializer : JsonNetSerializer
{
...

protected override void ModifyJsonSerializerSettings(JsonSerializerSettings settings)
    {
      settings.DateParseHandling = DateParseHandling.DateTimeOffset;
      settings.Converters.Add(new DictionaryJsonConverter());
      settings.ContractResolver = new NoConstructorCreationContractResolver();
    }
}

_settings = new ConnectionSettings(_connectionPool, s => new MyJsonNetSerializer(s));      
_client = new ElasticClient(_settings);

```

Thanks

---

<div class="post-metadata">

**Author:** ![forloop](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/forloop/32/9021_2.png) [@forloop](https://discuss.elastic.co/u/forloop)\
**Post date:** [August 29, 2016, 12:49am UTC](https://discuss.elastic.co/t/nest-add-a-custom-contractresolver/58935/2 "2016-08-29T00:49:05Z")

</div>

hey @Denis_Lamanov, what version of NEST are you using?

---

<div class="post-metadata">

**Author:** ![Denis\_Lamanov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/denis_lamanov/32/13111_2.png) [@Denis\_Lamanov](https://discuss.elastic.co/u/Denis_Lamanov)\
**Post date:** [August 29, 2016, 10:16am UTC](https://discuss.elastic.co/t/nest-add-a-custom-contractresolver/58935/3 "2016-08-29T10:16:31Z")

</div>

Hi @forloop,

I'm using the latest version from NuGeT: 2.0.0.0

Thanks

---

<div class="post-metadata">

**Author:** ![forloop](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/forloop/32/9021_2.png) [@forloop](https://discuss.elastic.co/u/forloop)\
**Post date:** [August 31, 2016, 8:40am UTC](https://discuss.elastic.co/t/nest-add-a-custom-contractresolver/58935/4 "2016-08-31T08:40:42Z")

</div>

You can't add a custom `IContractResolver` in NEST; This is intentional because the [`ElasticContractResolver` that is used by the default `IElasticsearchSerializer`](https://github.com/elastic/elasticsearch-net/blob/2.x/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs) has a few features that are used internally

1. constructs `JsonConverter` instances in some scenarios that require state at the point of deserialization
2. handles not serializing empty collections or collections that only contain `null` items
3. gets property names from property mappings configured with NEST mapping attributes
4. builds serialization models for concrete types from implemented interfaces

[You can however add your own `JsonConverter` instances](https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/connecting.html#_overriding_default_json_net_behavior), if you'd like to handle serialization for certain types in a particular way. Here's an example of defining our own converter for handling `DateTime`, `DateTimeOffset` and their nullable counterparts

```
void Main()
{
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    var connectionSettings = new ConnectionSettings(
        pool, 
        new HttpConnection(), 
        new SerializerFactory(settings => new CustomSerializer(settings)));
				
    var client = new ElasticClient(connectionSettings);
}

public class CustomSerializer : JsonNetSerializer
{
    public CustomSerializer(IConnectionSettingsValues settings) : base(settings)
    {
    }

    protected override IList<Func<Type, JsonConverter>> ContractConverters => 
        new List<Func<Type, JsonConverter>>
        {
            t => (t == typeof(DateTime) ||
                  t == typeof(DateTime?) ||
                  t == typeof(DateTimeOffset) ||
                  t == typeof(DateTimeOffset?))
                ? new Newtonsoft.Json.Converters.IsoDateTimeConverter { DateTimeStyles = System.Globalization.DateTimeStyles.AdjustToUniversal } 
                : null
        };
}

```

[You can also write your own `IElasticsearchSerializer` implementation too.](https://github.com/elastic/elasticsearch-net/blob/2.x/src/Elasticsearch.Net/Serialization/IElasticsearchSerializer.cs)

What do you need to do in `NoConstructorCreationContractResolver`? Wondering if it's something that can be achieved another way.

---

<div class="post-metadata">

**Author:** ![Denis\_Lamanov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/denis_lamanov/32/13111_2.png) [@Denis\_Lamanov](https://discuss.elastic.co/u/Denis_Lamanov)\
**Post date:** [August 31, 2016, 9:03am UTC](https://discuss.elastic.co/t/nest-add-a-custom-contractresolver/58935/5 "2016-08-31T09:03:23Z")

</div>

Hi @forloop,

Perfect full answer, working on it)

Thanks

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 5, 2017, 10:23pm UTC](https://discuss.elastic.co/t/nest-add-a-custom-contractresolver/58935/6 "2017-07-05T22:23:42Z")

</div>


