C# POCO类上的扩展方法在哪一点上过度使用了?
我的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
个人
有:地址
,电话
,案例注释
,通知派系
我开始编写一个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; }
}