所以,让我们说我有一个Person实体:
PERSON
ID
FirstName
LastName
SSN
LastModifiedDate
此表存在于数据库中,并且是我的.edmx文件的一部分之后,我通常会为实体创建一个部分类,用于执行某些特定于对象的工作。例如,对于Person实体,我可能有一个UpdateLastModifiedDate()方法,它只是将LastModifiedDate字段的值设置为所选对象的当前日期和时间。
然而,我的问题与更多" generic"与任何特定对象无关的方法。例如,让我们说我想创建一个GetPersonBySSN()方法,该方法接受SSN并返回带有该SSN的Person对象(如果存在)。我在哪里存储这种方法?
我无法将它存储在部分类中(可以吗?)因为我必须做一些奇怪的事情:
Person myPerson = db.Person.where(u => u.ID = 12345);
Person myPerson2 = myPerson.GetPersonBySSN(123456789);
这样做是很有意义的。
另外,我不愿意创建第二个静态类来存储这些" generic"方法(比如可能是PersonGenericMethods类)因为我觉得我应该只用主类Person来做这个。
你会在哪里储存这些" generic"方法
编辑:我正在使用ASP.NET MVC,并希望了解如何使用它进行最佳构建。
答案 0 :(得分:3)
另外,我不愿意创建第二个类来存储这些" generic"方法(比如可能是PersonGenericMethods类)因为我觉得我应该只用主类Person来做这个。
如何回归PersonRepository
课程?该类将负责与基础Person
数据存储进行交互 - 获取,更新,删除等。
您似乎想要的是Active Record Pattern 实体类负责创建,更新和删除自己。虽然这在Ruby等其他平台中更为常见,但在大多数.NET体系结构中,实体与存储库的分离更为常见。
您拥有的分离越多(实体,存储库,业务逻辑,UI逻辑等),您拥有的灵活性和可重用性就越高。然而,这是以额外复杂性为代价的。
答案 1 :(得分:1)
存储库模式非常适合这种情况。 请记住,您正在编写OO。让这个人脱离“自己”是很奇怪的。
存储库将获取您的数据并返回您想要的结果。
旁注:
Person myPerson = db.Person.where(u => u.ID = 12345);
Person myPerson2 = myPerson.GetPersonBySSN(123456789);
奇怪的是,首先,你得到ID = ...的人,然后作为你想要确保ssn是相同数字的人的函数?
你的回购会是这样的:
public class PersonRepository
{
private readonly DBContext _myContext'
public PersonRepository(DBContext myContext)
{
_myContext = myContext; //<== Dependency INjection
}
public function Person GetBySSN(int ssn)
{
return _myContext.FirstOrDefault(p => p.ssn = ssn);
}
}
只是给了一个很好的基础。
然后用于以后的改进:您可以查看Maybe
和Results
类型,但如果您是新手,请忘记它:)
享受!