关于List <t>请求的类属性 - 类设计困境</t>

时间:2009-06-10 21:38:06

标签: c# .net oop generic-list

当我需要从表(数据库)中获取多个记录时,我的方法会填充特定类的List(我的所有数据访问层方法都使用List来设置基于set的语句。我不使用datatable / dataset或者xmlDocument方法)。让我们假设下一个简化的场景;我有两个类 - 客户和包含这些字段/属性的订单:

Class Customer{
   int IDCustomer
   string CustomerName
   string CustomerAddress
   string CustomerCity
}

Class Order{
   int IDOrder
   int IDCustomer
   string SalePersonName
   decimal OrderSubTotal
   datetime OrderDateCreated
}

因此,假设我们需要一个向UI(ObjectDataSource)传递所有数据的方法 从Customer类订购类属性+ CustomerName和CustomerCity。 我希望Order类中的方法看起来像:

public List<Order> SelectAll(){ 
}

那么我应该采用哪种方法来实现这一目标?如何设置Order Class,使其包含有关最佳实践,面向对象范例,性能等的两个额外属性(CustomerName和CustomerCity):

APROACH A:


Class Order{
   int IDOrder
   int IDCustomer
   string SalePersonName
   decimal OrderSubTotal
   datetime OrderDateCreated
   //--- plus two extra properties of type string
   string CustomerName
   string CustomerCity
}

APROACH B:


Class Order{
   int IDOrder
   int IDCustomer
   string SalePersonName
   decimal OrderSubTotal
   datetime OrderDateCreated
   //--- plus extra property of type Customer
   Customer _Customer
}

APROACH C:


???

我在.NET 2.0上。

5 个答案:

答案 0 :(得分:1)

创建另一个展开查询的类是没有问题的,它们充当视图模型。

答案 1 :(得分:0)

毫无疑问,B。客户与订单之间存在一对多的关系 - 客户有很多订单(订单清单),订单有一个客户(客户类型的标量属性)。

public class Customer
{
   public Int32 Id { get; private set; }
   public String Name { get; private set; }
   public String Address { get; private set; }
   public String City { get; private set; }

   public IList<Order> Orders { get { return this.orders; } }
   private readonly IList<Orders> orders = new List<Orders>();
}

Class Order
{
   public Int32 Id { get; private set; }
   public String SalesPersonName { get; private set; }
   public Decimal SubTotal { get; private set; }

   public Customer Customer { get; private set; }
}

对于用户界面,您可以创建一个单独的类来包装如下的订单。

public class OrderView
{
    private readonly Order order;

    public OrderView(Order order)
    {
        this.order = order;
    }

    public Decimal SubTotal { get { return this.order.SubTotal; } }
    public String CustomerCity { get { return this.order.Customer.City; } }
    // ...
}

答案 2 :(得分:0)

这听起来像是ORM的工作。

答案 3 :(得分:0)

如果您允许存在一对多客户订单关系,则会出现具有订单列表的客户类。虽然这略微偏离了您的原始请求,但您可能更容易操纵客户及其包含的订单,而不是从父级复制成员。

Class Customer{
   int IDCustomer
   string CustomerName
   string CustomerAddress
   string CustomerCity
   List<Order> orders;

   public List<Order> SelectAll(){ return orders; }
}

Class Order{
   int IDOrder
   //int IDCustomer -not necessary as parent contains this info
   string SalePersonName
   decimal OrderSubTotal
   datetime OrderDateCreated
}

答案 4 :(得分:0)

因为这是一个设计问题,我认为需要更多信息来提供完整的答案,因为我认为这取决于具体情况。

如果您已经加载了Order对象并加载了Customer对象,并将它们用于表示层中的不同内容,那么创建一个专门的类来展平显示数据是一个很好的解决方案。

如果您要加载信息以显示订单列表并需要每个订单上的客户信息,那么我将不得不问为什么您不只是创建一个CustomerOrder类,其中包含相关字段并且只是加载首先是因为你不打算使用客户的额外数据。

所有这些设计决策都取决于外部因素。最后,我会说正确的设计决策通常是最简单的,满足您的需求。