如何告诉 Nest ElasticSearch 只使用 InterfaceProperties
How to tell Nest ElasticSearch to only use InterfaceProperties
我们正在研究 ElasticSearch (Nest),但 运行 遇到了问题。
在我们的应用程序中,我们只想为我们的对象使用接口。在这些接口中,我希望能够设置索引哪些属性,哪些不索引。
public interface ISomething {
string Name {get;set;}
int Id {get;set;}
}
public class Something: ISomething {
public string Name { get;set; }
public int Id {get;set;}
// This property should not be visible
public string VerySecretCode {get;set}
}
当我们通过创建一个新的 ElasticClient() 来索引一个接口时,该对象的所有属性都被放入 json。是否可以告诉 ElasticClient 我们只希望显示接口公开的属性?
希望大家帮帮忙。
最佳做法是将数据模型与域模型分开。我建议您创建一个新的 class/interface ISomethingForES。然后,您可以使用 Automapper 或类似工具为您映射字段。优点是您可以使用不属于您的域模型的 ES 特定属性来注释 SomethingForES。这是一个例子:
[ElasticType(Name = "type123")]
public class SomethingForES: ISomethingForES {
public string Name { get;set; }
public int Id {get;set;}
}
我们最终在设置中添加了自己的转换器:
public class MyConverter:ElasticContractResolver
{
public MyConverter(IConnectionSettingsValues connectionSettings)
: base(connectionSettings)
{
}
protected override JsonContract CreateContract(Type objectType)
{
if (objectType.Assembly.FullName.Contains("MyDefinition") && objectType.IsInterface)
{
var name = objectType.Name;
//Check if name starts with an 'I' and the second char is a UpperCase aswell to be sure the given Type.Name is a interface.
if (name.StartsWith("I") && char.IsUpper(name[1]))
{
//Remove the I from the name
name = name.Substring(1);
Assembly assembly = Assembly.Load(<MyAssembly>);
Type t = assembly.GetType("MyNamespace" + name);
if (t != null)
{
objectType = t;
}
}
}
var baseReturn = base.CreateContract(objectType);
return baseReturn;
}
}
之后创建了我们自己的对象,而不是尝试实例化接口。
我们正在研究 ElasticSearch (Nest),但 运行 遇到了问题。 在我们的应用程序中,我们只想为我们的对象使用接口。在这些接口中,我希望能够设置索引哪些属性,哪些不索引。
public interface ISomething {
string Name {get;set;}
int Id {get;set;}
}
public class Something: ISomething {
public string Name { get;set; }
public int Id {get;set;}
// This property should not be visible
public string VerySecretCode {get;set}
}
当我们通过创建一个新的 ElasticClient() 来索引一个接口时,该对象的所有属性都被放入 json。是否可以告诉 ElasticClient 我们只希望显示接口公开的属性?
希望大家帮帮忙。
最佳做法是将数据模型与域模型分开。我建议您创建一个新的 class/interface ISomethingForES。然后,您可以使用 Automapper 或类似工具为您映射字段。优点是您可以使用不属于您的域模型的 ES 特定属性来注释 SomethingForES。这是一个例子:
[ElasticType(Name = "type123")]
public class SomethingForES: ISomethingForES {
public string Name { get;set; }
public int Id {get;set;}
}
我们最终在设置中添加了自己的转换器: public class MyConverter:ElasticContractResolver {
public MyConverter(IConnectionSettingsValues connectionSettings)
: base(connectionSettings)
{
}
protected override JsonContract CreateContract(Type objectType)
{
if (objectType.Assembly.FullName.Contains("MyDefinition") && objectType.IsInterface)
{
var name = objectType.Name;
//Check if name starts with an 'I' and the second char is a UpperCase aswell to be sure the given Type.Name is a interface.
if (name.StartsWith("I") && char.IsUpper(name[1]))
{
//Remove the I from the name
name = name.Substring(1);
Assembly assembly = Assembly.Load(<MyAssembly>);
Type t = assembly.GetType("MyNamespace" + name);
if (t != null)
{
objectType = t;
}
}
}
var baseReturn = base.CreateContract(objectType);
return baseReturn;
}
}
之后创建了我们自己的对象,而不是尝试实例化接口。