其他分享
首页 > 其他分享> > 泛型和实体框架:如何根据列值返回不同的类型

泛型和实体框架:如何根据列值返回不同的类型

作者:互联网

我们有一个“人”表,其中存储了不同类型的人(买方,卖方,代理商等).我们的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;

我的想法是,当我从存储库中获取信息时,我知道会遇到什么样的人.而且,是的,我可以创建X个不同的Get方法,分别称为GetBuyer(int PersonId),GetSeller(int PersonId)等.但这有代码味.

通用函数的外观如何?

到目前为止,这是我的存储库界面:

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?
    }

解决方法:

我建议使用类似:

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;
}    

标签:entity-framework-ctp5,repository-pattern,generics,c,entity-framework
来源: https://codeday.me/bug/20191105/1995531.html