我的POCO的结构基本上是这样的:
Person
有:Addresses
、Phones
、CaseNotes
、NoticeOfActions
。
我开始编写一个PersonExtension
类,我发现它非常有用,比如说,以下示例方法:
public static Person GetPersonsPhones(this Person person, string userID)
{
using (var context = ConnectDataContext.Create())
{
var pPhones =
context.tblPhones.Where(phones => phones.PersonID == person.PersonID).Select(
phones =>
new Phone()
{
PhoneID = phones.PhoneID,
PhoneType =
new PhoneType
{
PhoneTypeID = phones.tblAdminPhoneType.PhoneTypeID,
TypeDescription = phones.tblAdminPhoneType.PhoneTypeDesc
},
PhoneNumber = phones.PhoneNumber,
Extension = phones.Extension
});
person.Phones = pPhones.ToList<Phone>();
return person;
}
}
现在,我为获取地址集合的人提供了类似的扩展方法。 我想知道的是,是否有一个点是有害的。 由于我环境的性质,几乎所有东西都适合Person
has-a
方式。
可以吗,还是我会遇到什么不好的事情? 我这样会产生更多的开销吗?
另一种选择似乎是简单地传递Person.ID
因为这是我从数据库获取电话然后将其添加到我的Person
对象中所需要的,但无论如何,对我来说,这似乎是一回事。
我认为这里有沟通中断,这很可能是我的错,因为我并不总是使用正确的词来描述事情。
在我的数据库中有tblPerson和tblPhone。 我有一个名为Person
的类和一个名为Phone
的类。 我的Person
类具有 IList<Phone>Phones
的属性。
有问题的扩展方法适用于基类的子属性的 CRUD 方法。
即 Person.GetPhones()
填充该Person
对象的IList<Phone>Phones
属性。 Person.SavePhones()
将Save
对该Person
对象的数据库Phones
的任何更改。
正在做的事情是正确的(我怀疑它是......:((,只是试图确保每个人都理解我在问什么。
另外,我正在使用LinqToSQL
进行数据库访问。
你在这里的人应该是一个成熟的领域对象,而不是一个 POCO。这个人应该告诉一些事情他们的电话号码,这个人不应该负责去数据库并把它们拿出来!无论您是否选择扩展方法,后者都适用。
但是,关于您的问题,我认为扩展方法是扩展第三方代码某些功能的方式。例如,您可以对字符串执行ToUpper()
。将其扩展为标题案例会很好。在这里,我们将扩展行为。我们在没有源代码的情况下"添加"到第三方代码,因为另一种方法是引入一个包装字符串的新对象来执行此操作。这里的扩展方法只是真正的语法糖。
如果您拥有代码,那么扩展方法毫无意义,因为您可以使该方法成为相关类上的完全成熟的方法。我这样说的原因是,使用适当的方法,您可以访问要扩展的类的私有字段,因此使用扩展方法,您仅限于公共可见性,就像普通的静态方法一样。
我认为主要的缺点往往是代码组织。OOP的重点不是尝试将相关代码保持在一起吗?
我很好奇你为什么在这里使用扩展方法。如果 Person 是实体对象,我将创建一个扩展实体类的分部类。对我来说,这里似乎是一个更好的组织。
如果您将 POCO 类与 EntityFramework 代码优先模型一起使用,您应该能够像这样编写您的 POCO 类(目前仅包括 Phone,只是为了演示(:
class Person
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Phone> Phones { get; set; }
}
class Phone
{
public long Id { get; set; }
public string Name { get; set; }
public long PersonId { get; set; }
public virtual Person Person { get; set; }
}
现在,您可以直接访问myPerson.Phones
,无需扩展方法。
如果它是你的类,那么你应该为这个类编写真正的方法。 扩展方法可用于向无法更改的类添加功能,例如,没有源的库中的类,并且不能只是从中派生。