Umbraco - 将强类型对象映射到 IPublishedContent
Umbraco - Map strong-typed object to IPublishedContent
我 'conjoining' Umbraco 使用另一个 Web 应用程序并使用 Elasticsearch 将来自两个应用程序的数据存储在一个索引中。到目前为止,我一直只搜索 Umbraco 内容,获取其 ID,然后使用 UmbracoHelper 检索正确的 IPublishedContent 项,然后我将其映射到一个强类型对象 [Class1],它继承自 PublishedContentModel 抽象 class, 使用 Ditto.
目前在 Umbraco 应用程序中,Class1 对象正在使用 JSON.Net 序列化并输出,我无法更改它的结构。添加来自另一个非 Umbraco 应用程序的项目后,我想完全省略从 Umbraco 检索内容的步骤,而是将所有相关数据直接保存在索引中。这样我就可以根据索引的内容创建强类型对象。但是,在将项目重新映射到它的 DTO [Class1DTO] 之后,我发现自己无法将它们映射到 Class1。
显然,我不能再使用 Ditto,因为它仅在从 IPublishedContent 及其派生映射时才有效。我正在考虑使用 AutoMapper,但问题是,如果不传递 IPublishedContent 对象(因为需要实现 PublishedContentModel 构造函数),我无法实例化我的 Class1。
我知道我可以在没有 PublishedContentModel 继承的情况下复制我所有的强类型对象,但这样做感觉真的不对。有没有办法以某种方式伪造 IPublishedContent 对象,以便我可以使用 AutoMapper?或者有没有其他方法可以实现相同的输出?
示例 class 以下:
[JsonObject(MemberSerialization.OptIn)]
public class Class1 : PublishedContentModel
{
public Class1(IPublishedContent content)
: base(content)
{
}
[JsonProperty]
public string type { get; set; }
[JsonProperty]
public override int Id { get { return base.Id; } }
[JsonProperty]
public override string SomeData { get; set; }
}
[JsonObject(MemberSerialization.OptIn)]
public class Class1DTO
{
[JsonProperty]
public string type { get; set; }
[JsonProperty]
public int Id { get; set; }
[JsonProperty]
public string SomeData { get; set; }
[JsonProperty]
public SomeFilter FilterForSearch { get; set; }
}
您不能创建自己的不依赖 IPublishedContent 的 PublishedContentModel 版本吗?像这样:
public abstract class Base
{
public Int32 Id { get; set; }
public String Name { get; set; }
public String Path { get; set; }
public IList<Int32> PathIds
{
get
{
return !String.IsNullOrEmpty(Path) ? Path.Split(',').Select(x => Convert.ToInt32(x)).ToList() : null;
}
}
public Int32 ParentId
{
get
{
if (PathIds.HasItemsAndNotNull() && PathIds.Count >= 2)
return PathIds[PathIds.Count - 2];
return -1;
}
}
public Int32 Level { get; set; }
public DateTime CreateDate { get; set; }
public DateTime UpdateDate { get; set; }
public String WriterName { get; set; }
public String DocumentTypeAlias { get; set; }
}
除非您需要 PublishedContentModel 上非常具体的字段。
我 'conjoining' Umbraco 使用另一个 Web 应用程序并使用 Elasticsearch 将来自两个应用程序的数据存储在一个索引中。到目前为止,我一直只搜索 Umbraco 内容,获取其 ID,然后使用 UmbracoHelper 检索正确的 IPublishedContent 项,然后我将其映射到一个强类型对象 [Class1],它继承自 PublishedContentModel 抽象 class, 使用 Ditto.
目前在 Umbraco 应用程序中,Class1 对象正在使用 JSON.Net 序列化并输出,我无法更改它的结构。添加来自另一个非 Umbraco 应用程序的项目后,我想完全省略从 Umbraco 检索内容的步骤,而是将所有相关数据直接保存在索引中。这样我就可以根据索引的内容创建强类型对象。但是,在将项目重新映射到它的 DTO [Class1DTO] 之后,我发现自己无法将它们映射到 Class1。
显然,我不能再使用 Ditto,因为它仅在从 IPublishedContent 及其派生映射时才有效。我正在考虑使用 AutoMapper,但问题是,如果不传递 IPublishedContent 对象(因为需要实现 PublishedContentModel 构造函数),我无法实例化我的 Class1。
我知道我可以在没有 PublishedContentModel 继承的情况下复制我所有的强类型对象,但这样做感觉真的不对。有没有办法以某种方式伪造 IPublishedContent 对象,以便我可以使用 AutoMapper?或者有没有其他方法可以实现相同的输出?
示例 class 以下:
[JsonObject(MemberSerialization.OptIn)]
public class Class1 : PublishedContentModel
{
public Class1(IPublishedContent content)
: base(content)
{
}
[JsonProperty]
public string type { get; set; }
[JsonProperty]
public override int Id { get { return base.Id; } }
[JsonProperty]
public override string SomeData { get; set; }
}
[JsonObject(MemberSerialization.OptIn)]
public class Class1DTO
{
[JsonProperty]
public string type { get; set; }
[JsonProperty]
public int Id { get; set; }
[JsonProperty]
public string SomeData { get; set; }
[JsonProperty]
public SomeFilter FilterForSearch { get; set; }
}
您不能创建自己的不依赖 IPublishedContent 的 PublishedContentModel 版本吗?像这样:
public abstract class Base
{
public Int32 Id { get; set; }
public String Name { get; set; }
public String Path { get; set; }
public IList<Int32> PathIds
{
get
{
return !String.IsNullOrEmpty(Path) ? Path.Split(',').Select(x => Convert.ToInt32(x)).ToList() : null;
}
}
public Int32 ParentId
{
get
{
if (PathIds.HasItemsAndNotNull() && PathIds.Count >= 2)
return PathIds[PathIds.Count - 2];
return -1;
}
}
public Int32 Level { get; set; }
public DateTime CreateDate { get; set; }
public DateTime UpdateDate { get; set; }
public String WriterName { get; set; }
public String DocumentTypeAlias { get; set; }
}
除非您需要 PublishedContentModel 上非常具体的字段。