次のようなコレクションプロパティを持つエンティティがあります。
public class MyEntity
{
public virtual ICollection<OtherEntity> Others { get; set; }
}
データコンテキストまたはリポジトリを介してこのエンティティを取得する場合、を使用して他のユーザーがこのコレクションにアイテムを追加しないようにしますMyEntity.Others.Add(entity)
。これは、エンティティをコレクションに追加する前に、検証コードを実行したい場合があるためです。私はこのMyEntity
ような方法を提供することによってこれを行います:
public void AddOther(OtherEntity other)
{
// perform validation code here
this.Others.Add(other);
}
私はこれまでにいくつかのことをテストしましたが、最終的に到達したのはこのようなものです。エンティティにコレクションを作成し、private
公開すると次のpublic ReadOnlyCollection<T>
ようになりMyEntity
ます。
public class MyEntity
{
private readonly ICollection<OtherEntity> _others = new Collection<OtherEntity>();
public virtual IEnumerable<OtherEntity>
{
get
{
return _others.AsEnumerable();
}
}
}
これは私が探しているもののようで、単体テストは問題なく合格していますが、まだ統合テストを開始していないので、疑問に思っています。
- 私が探しているものを達成するためのより良い方法はありますか?
- このルートを進むことにした場合(可能であれば)、私が直面する影響は何ですか?
いつも助けてくれてありがとう。
編集1をからに変更し、ゲッターとして使用ReadOnlyCollection
しています。ユニットテストは問題なく合格しますが、統合中に直面する問題がわからないため、EFは関連するエンティティを使用してこれらのコレクションの構築を開始します。IEnumerable
return _others.AsEnumerable();
編集2そこで、内部コレクションに追加する前に、提供されたエンティティに対してメソッドが検証を実行する場所をValidatableCollection
実装する派生コレクション(それを呼び出す)を作成する提案を試すことにしました。残念ながら、Entity Frameworkは、ナビゲーションプロパティを構築するときにこのメソッドを呼び出すため、実際には適していません。ICollection
.Add()