将复杂对象作为类成员处理的最佳实践是什么?

时间:2013-05-08 17:41:32

标签: c# asp.net oop

好的,一个基本的例子说我有一个带有费用的应用程序,我的SQL数据库中的每个费用都有一个Id,Employee Id和Amount。我应该这样做:

public class Expense
{
    public int Id { get; set; }
    public Employee Employee { get; set; }
    public decimal Amount { get; set; }
}

或者这个:

public class Expense
{
    public int Id { get; set; }
    public int EmployeeId { get; set; }
    public decimal Amount { get; set; }
}

你看我通常会做第一次,当我从数据库中获取费用时,我会通过调用类似于Employee = new Employee(int id)之类的构造函数来设置Employee字段,这样就可以再次访问数据库以完成成员在Employee对象中。这很方便,因为现在我可以通过费用访问Employees成员/职能。如果我绑定为ObjectDataSource,我可以显示类似Eval("Employee.Name")的内容,并显示更友好的内容,然后只显示存储在数据库中的数字。

然而,我正在处理的当前项目可能会运行数十万行,如果我获取每个对象的第一个费用详细信息和员工详细信息,那么数据库请求的数量将会增加。 (事实上​​,我目前的项目有一个包含6-7个外键的表格。)

有没有办法吃蛋糕和吃它?

也许通过只有Id字段的接口类而不是完整的对象字段?但我觉得我从来没有完全理解界面,所以我不确定这是否会产生影响。

感谢所有读过这篇文章的人,即使你对我没有任何答案。

2 个答案:

答案 0 :(得分:3)

这取决于:如果您正在使用功能丰富的ORM(NHibernate),它可以干净地处理关系之类的事情,那么第一个代码会更方便;或者如果这些是您的View Model对象,您可以将此任务委派给DI引擎(如Ninject)。

如果您的应用程序的设计需要更多地控制对象的来来去去或者您是否大量使用Expense(不是Employee),那么您应该使用第二种设计(当然,NHibernate有一个可用于实现的复杂缓存工具箱这一点)。

答案 1 :(得分:0)

在我看来,您的第二个示例不会阻止您同时获取数据集中的费用和员工。另一方面,我猜你可以为一个雇员支付很多费用,所以如果你拿到1000个与100个雇员相关的费用,那么你就有1000个员工对象,其中900个是自重。如何在类中表示它们并不一定会改变您在数据库中表示它们的方式。