Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# POCO类上的扩展方法在哪一点上过度使用了?_C#_Linq_Extension Methods - Fatal编程技术网

C# POCO类上的扩展方法在哪一点上过度使用了?

C# POCO类上的扩展方法在哪一点上过度使用了?,c#,linq,extension-methods,C#,Linq,Extension Methods,我的POCO结构基本上如下所示: 个人有:地址,电话,案例注释,通知派系 我开始编写一个PersonExtension类,我发现该类对于以下示例方法非常有用: public static Person GetPersonsPhones(this Person person, string userID) { using (var context = ConnectDataContext.Create()) { var pPhones = c

我的POCO结构基本上如下所示:

个人
有:
地址
电话
案例注释
通知派系

我开始编写一个
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;
    }
}
public static Person getPersonPhones(此人,字符串userID)
{
使用(var context=ConnectDataContext.Create())
{
瓦普霍内斯=
context.tblPhones.Where(phones=>phones.PersonID==person.PersonID)。选择(
电话=>
新电话
{
PhoneID=phones.PhoneID,
电话类型=
新电话类型
{
PhoneTypeID=phones.tblAdminPhoneType.PhoneTypeID,
TypeDescription=phones.tblAdminPhoneType.PhoneTypeDesc
},
PhoneNumber=phones.PhoneNumber,
分机=电话。分机
});
person.Phones=pPhones.ToList();
返回人;
}
}
现在,我为获取地址集合的人提供了类似的扩展方法。我想知道的是,这是否有一点是有害的。由于我所处环境的性质,几乎所有东西都符合
Person
has-a
方式

这样可以吗?或者我会遇到什么不好的事情?那样我的开销会更大吗

另一种方法似乎是简单地传递
Person.ID
,因为这是我从数据库获取电话所需要的,然后将其添加到我的
Person
对象中,但对我来说,这似乎是一样的


我认为这里的沟通出现了问题,这很可能是我的错,因为我对事情不总是使用正确的词语

在我的数据库中有tblPerson和tblPhone。我有一个叫做
Person
的类和一个叫做
Phone
的类。我的
Person
类的属性为
IListPhones

所讨论的扩展方法用于我的基类的子属性的CRUD方法。
i、 e.
Person.GetPhones()
填充该
Person
对象的
IListPhones
属性
Person.SavePhones()
Phones
的任何更改保存到
Person
对象的数据库中

我不是说我所做的是对的(我怀疑这是…:()只是想确保每个人都理解我的要求。

另外,我正在使用
LinqToSQL
进行数据库访问。

我认为主要的缺点可能是代码组织。OOP的目的不是要尝试将相关代码保持在一起吗


我很好奇你为什么在这里使用扩展方法。如果Person是实体对象,我会创建一个分部类来扩展实体类。对我来说,这里的组织似乎更好一些。

我认为主要的缺点是代码组织。OOP的目的不是要尝试将相关代码保持在一起吗


我很好奇你为什么在这里使用扩展方法。如果Person是实体对象,我会创建一个分部类来扩展实体类。在我看来,这是一个更好的组织方式。

如果它是你的类,那么你应该为该类编写真正的方法。扩展方法对于向需要扩展的类添加功能非常有用例如,你不能更改一个没有源代码的库中的类,也不能仅从中派生。如果它是你的类,那么你应该为该类编写真实的方法。扩展方法对于向不能更改的类添加功能非常有用,例如,一个没有源代码的库中的类你不能仅仅从中派生。

你在这里的人应该是一个成熟的POCO,而不是一个POCO。这个人应该,这个人不应该负责转到数据库并取出它们!无论你是否选择扩展方法,后者都适用

然而,关于你的问题,我认为扩展方法是扩展第三方代码的某些功能的一种方式。例如,你可以对字符串执行
ToUpper()
。将此扩展为todo标题大小写会很好。这里我们扩展了该行为。我们正在“添加”在没有源代码的情况下编写第三方代码,因为另一种方法是引入一个新对象来包装字符串,这样做。这里的扩展方法只是真正的语法糖


如果你拥有代码,那么扩展方法是没有意义的,因为你可以让这个方法成为相关类上的一个完全成熟的方法。我这么说的原因是,有了一个合适的方法,你可以访问你正在扩展的类的私有字段,因此使用扩展方法,你只能像nor一样公开错误的静态方法。

这里的人应该是一个成熟的POCO,而不是一个POCO。这个人应该,这个人不应该负责转到数据库并取出它们!无论您是否选择扩展方法,后者都适用

然而,关于你的问题,我认为扩展方法是扩展第三方代码的某些功能的一种方式。例如,你可以对字符串执行
ToUpper()
。将此扩展为todo标题大小写会很好。这里我们扩展了该行为。我们正在“添加”在没有源代码的情况下编写第三方代码,因为另一种方法是引入一个新对象来包装字符串,这样做。这里的扩展方法只是真正的语法糖

如果您拥有代码,则扩展
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; }
}