POCO 类上的扩展方法在什么时候矫枉过正

本文关键字:什么时候 矫枉过正 方法 扩展 POCO | 更新日期: 2023-09-27 18:28:21

我的POCO的结构基本上是这样的:

Person有:AddressesPhonesCaseNotesNoticeOfActions

我开始编写一个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 类上的扩展方法在什么时候矫枉过正

你在这里的人应该是一个成熟的领域对象,而不是一个 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,无需扩展方法。

如果它是你的类,那么你应该为这个类编写真正的方法。 扩展方法可用于向无法更改的类添加功能,例如,没有源的库中的类,并且不能只是从中派生。