4

私のドメイン クラスには、次のようなコレクションがあります。

private List<Foo> _foos = new List<Foo>();
public virtual ReadOnlyCollection<Foo> Foos { get { return _foos.AsReadOnly(); } }

これにより、クラス内から (フィールド _foos を使用して) 変更できる読み取り専用コレクションが得られます。

このコレクションは次のようにマッピングされます (Fluent NHibernate):

HasMany(x => x.Foos).KeyColumn("ParentClassId").Cascade.All().Inverse().Access.CamelCaseField(Prefix.Underscore);

このコレクションを使用しようとすると、次のようになります。

タイプ 'NHibernate.Collection.Generic.PersistentGenericBag 1[Foo]' to type 'System.Collections.Generic.List1[Foo]' のオブジェクトをキャストできません。

Unable to cast object of type NHibernate.Collection.Generic.PersistentGenericBag to Listによると、NHibernate が独自のコレクション クラスの 1 つを注入できるように、コレクションをインターフェイスとして NHibernate に公開する必要があるためです。

この記事では、代わりに IList を使用することを提案していますが、残念ながら、このインターフェイスには AsReadOnly() メソッドが含まれていないため、読み取り専用コレクションのみを外部に公開するという私の計画が台無しになります。

代わりに使用できるインターフェイス、同じ要件を満たす別のアプローチ、またはそれほどフラストレーションを伴わない別のキャリアを提案できる人はいますか?

ありがとう

デビッド

4

4 に答える 4

7

AsReadOnly() メソッドは、ReadOnlyCollection を取得する唯一の方法ではありません。

private IList<Foo> _foos = new List<Foo>();
public virtual ReadOnlyCollection<Foo> Foos { get { return new ReadOnlyCollection<Foo>(_foos); } }

別のフープがジャンプしました。

于 2010-07-28T13:18:53.663 に答える
5

あなたの答えは良い解決策ですが、コレクションを として公開するだけIEnumerable<T>です。これらは IList にキャストバックできるため、このアプローチには小さなリスクがあります。それが許容できるリスクであるかどうかは、アプリケーションによって異なります。

于 2010-07-28T13:47:55.370 に答える
3

IList があなたのニーズを満たさないという事実と、Automapping を (幸運にも) 使用していないという事実のために、私は Foos を保護/プライベート IList 'NHibernate-friendly' コレクションに設定し、次に読み取る public ReadOnlyCollection を作成しますフーズを通して。

何かのようなもの:

    protected IList<Foo> MappableFoos { get; set; }
    public ReadOnlyCollection<Foo> ReadOnlyFoos { get { return new ReadOnlyCollection<Foo>(MappableFoos) } }

    // Mapping file
    HasMany(x => x.MappableFoos ).KeyColumn("ParentClassId").Cascade.All().Inverse().Access.CamelCaseField(Prefix.Underscore);

このようにして、唯一の公開されたプロパティは、私がばかげて「ReadOnlyFoos」と呼んだものになります。

于 2010-07-28T13:20:17.550 に答える
1

IEnumerableの代わりにコレクションを公開することを検討してくださいReadOnlyCollection。モデルを特定のコレクション実装に結び付けることなく、基本的に同じレベルの保護を提供します。詳細については、この記事を参照してください。

于 2010-07-28T15:17:06.853 に答える