类(实体)
public class Entity
{
public ObjectId Id { get; set; }
public Entity()
{
Id = ObjectId.GenerateNewId();
}
}
班级(会员)
public class Member : Entity
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string MobileNumber { get; set; }
}
动作
public dynamic Get()
{
var response = UnitOfWork.MemberRepository.GetMembers();
return response;
}
我正在使用.NET WebAPI构建API并使用mongodb作为数据存储区,我在从数据库中序列化响应对象时遇到了一些麻烦。
无法理解为什么,在互联网上搜索一段时间,发现没有解决方案的类似问题。要么我是一个糟糕的谷歌搜索者,要么答案隐藏在深处:)
完整堆栈跟踪:http://pastie.org/8389787
答案 0 :(得分:1)
这是一个小小的猜测,但代码真的不太讲究。
我很确定这是因为C#Mongo驱动程序的BsonDocument
暴露了大量属性,例如AsBoolean
,AsInt
,AsString
等。调用这些getter on不可转换为相应类型的数据会导致异常。虽然我没有在堆栈跟踪中看到它们,但这可能是编译器优化。
一种解决方案是使代码强类型化(如果它还没有)。我不知道UnitOfWork.MemberRepository.GetMembers();
是什么,但它隐藏了你正在做的事情,而且还不清楚它返回的是什么。你失去了C#驱动程序的许多优点。顺便说一下,Collection<T>
类几乎就是一个存储库模式。
更简洁的方法(它们不是互斥的)是不将数据库对象序列化到外部世界,而是将 DTO 用于WebAPI端并在它们之间进行转换,例如使用AutoMapper。我会一直这样做,因为你在一个你不知道的序列化器中抛出一个可能用DB-Attributes装饰的对象 - 这可能会导致各种各样的问题。此外,您经常希望从外部隐藏某些信息,或将其设置为只读。
另一种选择是使用ServiceStack.Text
作为JSON序列化器,这样可以减少我的经验。