通过WCF序列化DTO

时间:2012-12-07 13:59:26

标签: wcf hibernate nhibernate serialization dto

NHibernate长期存在问题,我通过非最佳方式/解决方法解决了这个问题。

首先,我正在使用WCF REST与我的客户端应用程序进行通信。如您所知,序列化持久化实体不是最佳实践,并且总是会导致其他问题。因此,我总是用NHibernates变形金刚将我的实体映射到DTO。问题是我有使用变形金刚转换它们更复杂的实体。

如何使用变换器或任何其他nhibernate功能将子实体映射到子dto?

注意:我不想使用第三方,例如 Automapper

这些是我要映射的实体和DTO。变量名彼此完全相同。

实体类:

的EntityType

public class crmEntityType : EntityModel<crmEntityType>
{
    public crmEntityType()
    {
        Association = new List<crmEntityType>();
        Fields = new List<crmCustomField>();
    }

    public virtual int ID { get; set; }

    public virtual string Title { get; set; }

    public virtual ICollection<crmEntityType> Associations { get; set; }

    public virtual ICollection<crmCustomField> Fields { get; set; }

}

CustomFields

    public class crmCustomField : EntityModel<crmCustomField>
{
    public virtual int ID { get; set; }

    public virtual string Name { get; set; }

    public virtual crmEntityType EntityType { get; set; }
}

DTO的

EntityTypeDTO

[DataContract]
public class EntityTypeDTO
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public IList<CustomFieldDTO> Fields { get; set; }

    [DataMember]
    public int[] Associations { get; set; }
}

CustomFieldDTO

[DataContract]
    public class CustomFieldDTO
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int EntityType { get; set; }

    [DataMember]
    public int FieldType { get; set; }

}

1 个答案:

答案 0 :(得分:1)

我通过花费我的日夜来找到我的解决方案。最后,我得到了我能找到的最佳解决方案。我希望有一天能帮助我的人。

此linq查询只使用一个数据库往返。我认为它将类映射到内存中。

return (from entityType in Provider.GetSession().Query<crmEntityType>()
                .Fetch(x => x.Association)
                .Fetch(x => x.Fields)
                .AsEnumerable()
    select new EntityTypeDTO()
    {
        ID = entityType.ID,
        Title = entityType.Title,
        Association = entityType.Association.Distinct()
                               .Select(asc => asc.ID).ToArray<int>(),
        Fields = entityType.Fields.Distinct()
                               .Select(fi => new CustomFieldDTO 
                                            { ID = fi.ID, 
                                              Name = fi.Name, 
                                              Value = fi.Value, 
                                              EntityType = fi.EntityType.ID,
                                              Type = fi.Type 
                                            }).ToList()
    }).ToList();