3

さまざまなタイプの人 (買い手、売り手、エージェントなど) を格納する Persons テーブルがあります。私たちの ORM は Entity Framework CodeFirst (CTP5) です。適切な TDD とモッキングのためにリポジトリ パターンを使用しています。PersonRepository では、特定の型を返したいので、次のようなことができます。

Agent a = repository.Get<Agent>(5005);  // Where 5005 is just an example Id for the person
a.SomeAgentProperty = someValue;
Buyer b = repository.Get<Buyer>(253);   // Again, a simple PersonId.
b.SomeBuyerProperty = someOtherValue;

リポジトリから取得したときに、どのような人が取得されているかを知っているという考えです。そして、はい、GetBuyer(int PersonId)、GetSeller(int PersonId) などと呼ばれる X 個の異なる Get メソッドを作成することもできます。しかし、それにはコードの匂いがあります。

ジェネリック関数はどのように見えるでしょうか?

これまでの私のリポジトリインターフェースは次のとおりです。

public interface IPersonRepository
{
    Person Get(int PersonId);   // To get a generic person
    T Get<T>(int PersonId);     // To get a specific type of person (buyer, agent, etc.)
    void Save(Person person);
    void Delete(int p);
}

そして私の具体的な実装:

    public T Get<T>(int PersonId)
    {
        //Here's my question: What goes here?
    }
4

2 に答える 2

3

このメソッドを使用するOfType<T>()と、TPT を使用している場合は指定された T に対して EF が INNER JOIN を実行し、TPH を使用している場合はディスクリミネーターに基づくフィルターが実行されます。

public TPerson Get<TPerson>(int PersonId) where TPerson : Person
{
    return ctx.People
              .OfType<TPerson>()
              .SingleOrDefault(x => x.PersonId == PersonId);
}

そして、それはあなたが望むように機能します:

Agent a = repository.Get<Agent>(5005);
于 2011-01-22T06:17:12.630 に答える
1

次のようなものを使用することをお勧めします。

public T Get<T>(int PersonId) where T: new()
{
    return new T(PersonId);
}

コンストラクターにデータをロードするか、エンティティの各タイプに対してある種の Load メソッドを実装します。

interface IEntity
{
    void Load(int Id);
}

class CBuyer: IEntity
{
    public Load(int Id) { ... }
}

public T Get<T>(int PersonId) where T: IEntity, new()
{
    T ent = new T();
    ent.Load(PersonId);
    return ent;
}    
于 2011-01-22T06:15:04.000 に答える