你在哪里存储" generic"类方法?

时间:2017-07-11 20:18:41

标签: c# c#-4.0 design-patterns

所以,让我们说我有一个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,并希望了解如何使用它进行最佳构建。

2 个答案:

答案 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);
   }
 }

看看: https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

只是给了一个很好的基础。

然后用于以后的改进:您可以查看MaybeResults类型,但如果您是新手,请忘记它:)

享受!