0

类(实体)

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

4

1 回答 1

1

这有点猜测,但代码真的不太能说明问题。

我很确定这是因为 C# Mongo 驱动程序BsonDocument公开了大量的属性,如AsBoolean, AsInt,AsString等。在不能转换为相应类型的数据上调用这些 getter 会导致异常。虽然我没有在堆栈跟踪中看到它们,但这可能是编译器优化。

一种解决方案是使代码具有强类型(如果还没有的话)。我不知道是什么UnitOfWork.MemberRepository.GetMembers();,但它隐藏了你在做什么,也不清楚它返回了什么。您正在失去 C# 驱动程序的许多优点。顺便说一句,Collection<T>该类几乎已经是一个存储库模式。

一种更简洁的方法(它们不是互斥的)是不将数据库对象序列化到外部世界,而是将DTO用于 WebAPI 端并在它们之间进行转换,例如使用 AutoMapper。我总是会这样做,因为你在你不知道的序列化程序中抛出了一个可能用 DB-Attributes 装饰的对象——这可能会导致各种问题。此外,您通常希望对外部隐藏某些信息,或使其成为只读信息。

另一种选择是ServiceStack.Text用作 JSON 序列化程序,根据我的经验,这往往会减少麻烦。

于 2013-10-09T16:19:59.787 回答