我有一个相当棘手的问题,过去两天一直困扰着我。
这是我的班级:
public class MyClass: BaseEntity<int>
{
//Some other properties here...
public virtual Categorie Categorie { get; set; }
public virtual Bron Bron { get; set; }
public virtual IEnumerable<Label> Labels { get; set; }
}
我被迫使用NHibernate。所以我完成了映射,而IEnumerable
不能是List<T>
(它可以是IList<T>
)。但是当你调用我的web服务时,它无法序列化我的IEnumerable
,因为它是一个接口,IList也是如此。因为我使用nhibernate,所以我不能改变我的类布局。
所以我的问题基本上是: 我可以告诉Serializer它应该以列表的形式威胁它吗?或者是否有一个通用的集合类将序列化标签,不会让nhibernate生气?还是其他任何有用的东西?
答案 0 :(得分:2)
不完全是您问题的答案,但可能是您问题的答案:)
跨越流程边界发送实体并不是一个好主意。您可以将您的实体投射到DTO并发送它们。
如果您在服务合同中公开您的实体结构,那么您的实体将耦合到您服务的每个消费者(坏)。如果您在简单的DTO中定义服务合同,消费者将只依赖于它们而不依赖于您的实体(好)。
实体对DTO的投影也可以自动完成(使用automapper)。
此外,您还将避免与延迟加载实体相关的其他一些问题。
如果你仍然希望通过网络发送实体,那么你可以将IEnumerable属性标记为不可序列化,并使用只返回IEnumerable Property.ToArray()的数组类型的另一个属性,并且不映射NHibernate中的数组属性。