我们有一个人员表,其中存储不同类型的人员(买方、卖方、代理人等)。我们的 ORM 是实体框架 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?
}
Use the OfType<T>()
方法,如果您使用 TPT,这将导致 EF 对指定的 T 执行 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)