リポジトリパターンで少し新しい。派生エンティティの状態変更も処理する汎用リポジトリを構築しようとしています。これまでに行ったことは、プロパティをアップサートする必要があるものとしてフラグを立てるカスタム属性を作成することです。
属性:
public class DerivedObjectAttribute : Attribute
{
public enum EntityType
{
REFERENCE,
OBJECT
}
public EntityType DerivedType { get; set; }
}
状態の変化をカスケードしたいプロパティに対してこの属性を定義します。
サンプルエンティティ:
public class FightingCharacter : BaseEntity
{
public Costume costume { get; set; }
[DerivedObject(DerivedType=DerivedObjectAttribute.EntityType.REFERENCE)]
public SpecialFinish specialFinish { get; set; }
[DerivedObject(DerivedType = DerivedObjectAttribute.EntityType.REFERENCE)]
public List<MoveList> moveList { get; set; }
}
したがって、このクラスの場合、costumeプロパティはカスケードする必要はありませんが、specialFinishプロパティとmoveListプロパティはカスケードする必要があります。
次に、私のリポジトリで:
public class DataRepository<T> : IRepository<T> where T : BaseEntity {
private void TryDerivedUpsert(T entity)
{
Type type = entity.GetType();
PropertyInfo[] piList = type.GetProperties();
foreach (PropertyInfo pi in piList)
{
foreach (DerivedObjectAttribute attr in pi.GetCustomAttributes(typeof(DerivedObjectAttribute), false))
{
// What to do here?
}
}
}
}
最も内側のループでは、問題なくDerivedObjectAttributesを特定できます。問題は、オブジェクトのタイプと値を取得して、それをアップサートするにはどうすればよいですか?つまり、プロパティpiに変更をカスケードするフラグが設定されている場合は、適切なエンティティにキャストされたリポジトリを作成し、それをアップサートします。例えば:
DataRepository<EntityType> repo = new DataRepository<EntityType> ();
repo.Upsert(property as EntityType);
それは理にかなっていますか?それとも私は一般的なリポジトリについて完全に間違った方法で行っていますか?それが理にかなっている場合(私は驚かれることでしょう)、それをどのように行うのですか?(ここにリストされている例は単なる例です。ところで、私はまだ設計中であり、EFクラスはまだありません。)