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 で型をシリアル化/逆シリアル化できるようにしたいのですが、コードの残りの部分で、それ以外の場合は非公開にする必要があるフィールド/プロパティを上書きできるようにしたくありません。これを処理するパターンはありますか?Product オブジェクトを MongoDB に出し入れするための仲介としてのみ使用される別のクラスを持つことを考えましたProductDocが、これに対するより良い解決策があるかどうかはわかりません。

4

3 に答える 3

5

私は今のところ長い間mongoと仕事をしていません。ただし、このスレッドMongoDb Map Settersを読んだり、セッターを次のように保護したりすることができます。

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 に答える
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());

新しいリリースを追加することで、基になるコレクションに影響を与えます。 これは、設定されたルーチンを非公開にするという目標とは正反対です。

ただし、公開されたプロパティの型を List ではなく IEnumerable を実装するように変更し、リストの ReadOnly バージョンを返す場合。そのような...

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 に答える