0

リポジトリパターンで少し新しい。派生エンティティの状態変更も処理する汎用リポジトリを構築しようとしています。これまでに行ったことは、プロパティをアップサートする必要があるものとしてフラグを立てるカスタム属性を作成することです。

属性:

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クラスはまだありません。)

4

1 に答える 1

0

で値を取得し、 (piから)プロパティタイプpi.GetValue(entity, null)の汎用リポジトリ(Activate.CreateInstance)を作成できますが、多くのリフレクションを行う必要があります。

この場合、古典的な汎用リポジトリのアイデア(タイプごとに個別のリポジトリ)を削除するDbContextことを検討し、すべてのタイプを処理できる拡張のようなものを使用する必要があります。

切断されたシナリオ(WCF)がある場合、サーバー側のネストされたリストにすべての変更を複製し、EntityStateを手動で変更する必要があるため、主な問題はEF自体になります。

于 2012-07-03T06:56:22.620 に答える