У меня есть следующее индексный документ лицо:Как индексация и поиск вложенных свойств типа интерфейса в NEST
[ElasticType(Name = "Document", IdProperty = "Id")]
public class Document
{
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
public string Id { get; set; }
[ElasticProperty(Type = FieldType.Nested)]
public ICustomer Customer { get; set; }
}
где ICustomer может быть различными типами:
public interface ICustomer
{
}
public class Supplier : ICustomer
{
public string Name { get; set; }
//another properties
}
public class Vendor : ICustomer
{
public string Name { get; set; }
//another properties
}
Моего отображение:
Client.CreateIndex("Document", c => c
.AddMapping<Document>(m => m
.SearchAnalyzer("standard")
.IndexAnalyzer("standard")
.MapFromAttributes()
.NumericDetection()
.DateDetection();
Когда я сохраняю документ для его индексации, он сохраняет также вложенные объекты (Поставщик или Поставщик) правильно сериализован.
Но у меня есть проблема, когда я ищу данные. Я получаю следующее исключение из newtonsoft:
Type is an interface or abstract class and cannot be instantiated.
Я пытался создавать пользовательский JSon преобразователь
public class CustomJsonConvertor : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (objectType == typeof(Supplier))
{
return serializer.Deserialize(reader, typeof (Supplier));
}
if (objectType == typeof(Vendor))
{
return serializer.Deserialize(reader, typeof(Vendor));
}
throw new NotSupportedException(string.Format("Type {0} unexpected.", objectType));
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof (Supplier) || objectType == typeof (Vendor);
}
}
и зарегистрировать его как:
settings.AddContractJsonConverters(t => typeof(ICustomer).IsAssignableFrom(t) ? new CustomJsonConvertor() : null);
Но я получаю исключение в методе ReadJson, поскольку objectType имеет тип ICustomer и условия if (objectType == typeof (Поставщик)) никогда не верны. Параметр existingValue имеет значение null в этом методе, поэтому у меня нет опции, как определить правильный тип.
ПРИМЕЧАНИЕ: мои объекты (поставщик, поставщик) находятся в отдельной dll (плагин), и я не имею прямого доступа к ним при определении документа.
Можете ли вы посоветовать, что я делаю неправильно, или дать мне совет по лучшей практике, как бороться с интерфейсом или абстрактным классом внутри индекса документа и как бороться с полиморфизмом?
спасибо большое!