5

我知道我必须在我的类上具有公共读写属性,以便 MongoDB 驱动程序序列化/反序列化我的对象。但是我想知道是否有方法/首选方法可以从我的其余代码中隐藏写入属性?

例如。

class Product
{
    private List<Release> releases;

    public List<Release> Releases
    {
        get
        {
            return new List<Release>(releases); //I can protect 'releases' when reading by passing a copy of it
        }
        set
        {
            releases = value; //BUT how can I protect release when writing?
        }
    }
}

我希望 MongoDB 能够序列化/反序列化我的类型,但我不希望我的其余代码能够覆盖它原本应该是私有的字段/属性。有没有一种模式来处理这个?我曾考虑过有一个单独的ProductDoc类,它只是用作将 Product 对象进出 MongoDB 的中介,但我不确定是否有更好的解决方案。

4

3 回答 3

5

我已经很长时间没有使用 mongo 了。但是您可以尝试阅读此线程MongoDb Map Setters或尝试像这样保护您的 setter:

public List<Release> Releases
{
    get
    {
        return new List<Release>(releases); //I can protect 'releases' when reading by passing a copy of it
    }
    protected set
    {
        releases = value; //BUT how can I protect release when writing?
    }
}
于 2012-09-04T12:39:25.053 回答
2

如果您的属性由构造函数设置,另一种方法是将它们保持为只读,并用于MapCreator告诉 MongoDB 如何创建您的类的实例,并传入您要设置的属性。

例如,我有一个Time用三个只读属性调用的类:HourMinute一个Second公共构造函数,它需要一个小时、一分钟和一个秒的值。

以下是我如何让 MongoDB 将这三个值存储在数据库中并Time在反序列化期间构造新对象。

BsonClassMap.RegisterClassMap<Time>(cm =>
{
    cm.AutoMap();
    cm.MapCreator(p => new Time(p.Hour, p.Minute, p.Second));
    cm.MapProperty(p => p.Hour);
    cm.MapProperty(p => p.Minute);
    cm.MapProperty(p => p.Second);
}
于 2015-10-26T05:46:17.847 回答
1

此页面上的最佳答案目前存在一些重要的缺陷。

正如目前编写的解决方案:

public List<Release> Releases
{
    get
    {
        return new List<Release>(releases); //I can protect 'releases' when reading by passing a copy of it
    }
    protected set
    {
        releases = value; //BUT how can I protect release when writing?
    }
}

这不像写的那样工作。

obj.Releases.Add(new Release());

将通过向其添加新版本来影响基础集合。 这与将设置的例程设为私有的既定目标直接矛盾。

但是,如果您更改公开的属性类型以实现 IEnumerable 而不是 List 并返回列表的只读版本。如...

public IEnumerable<Release> Releases
{
    get
    {
        return new List<Release>(releases).AsReadOnly();
    }
    protected set
    {
        releases = value;
    }
}

然后两者

obj.Releases.Add(new Release());

obj.Releases = new List<Release>();

都会抛出构建错误并阻止修改底层集合。

于 2013-10-10T18:45:56.947 回答