【问题标题】:Best way to structure C# Class构造 C# 类的最佳方法
【发布时间】:2013-06-30 18:21:10
【问题描述】:

我有以下课程;

public class Hotel
{
   public int HotelId {get; set;}
   public string Name {get; set;}
   public string Address {get; set;}
   public string City{get; set;}
}

public class District
{
   public int DistrictId {get; set;}
   public string Name {get; set;}
}

然后我需要一个可以同时包含 DistrictId 和 HotelId 的类,所以我想创建一个如下所示的类

public class HotelDistrict
{
   public int DistrictId {get; set;}
   public int HotelId {get; set;}
}

这是正确的方法吗?或者他们是更好的选择?

【问题讨论】:

  • 您也可以使用Dictionary<int, int>,其中键可以是地区ID,值可以是酒店ID。
  • 您能解释一下为什么需要这个类以及如何使用它吗?
  • 是的,我也想过字典,但它们是首选/正确的方式吗?
  • HotelDistrict 类基本上是数据库表中数据的表示。
  • @Tommo1977,如果小区有不止一家酒店Dictionary不是一个好选择。使用Lookup<TKey, TElement>

标签: c# class object-model


【解决方案1】:

这对于数据库表设计来说非常重要。在 OOP 世界中,您通常会添加对类的引用,而不仅仅是对 id 的引用。

类似的东西

public class HotelDistrict
{
   public Distric District {get; set;}
   public Hotel Hotel {get; set;}
}

没有灵丹妙药,因此这条规则也有例外,但通常您希望避免创建对数据库表有很大影响的类。

【讨论】:

  • 我同意它看起来很像关联表,但另一方面,特别是在领域驱动设计方面,使用 ID 而不是对象作为引用可能是有利的。最后,一切都取决于您希望对象的松散耦合和/或内聚程度。
  • 谢谢,这是我认为的方式,只是对引用我想要的属性的类的引用。
【解决方案2】:

酒店和小区有many to one relationship。所以,Hotel 应该有映射到其对应的 District -

public class Hotel
{
   public int HotelId {get; set;}
   public string Name {get; set;}
   public string Address {get; set;}
   public string City{get; set;}
   public int DistrictId{get; set;}
}

【讨论】:

  • 虽然最好直接引用District
  • 是的,它只能获取类中的属性。
【解决方案3】:

您可以简单地在您的Hotel 中存储对District 的引用,或者在您的District 中存储一个List<Hotel>。通常,除非您正在处理编写数据库模型,否则您不应保留唯一标识符。如果这是一个数据库模型,那么假设您需要支持多个地区的酒店,您的解决方案就可以了。

【讨论】:

  • 我正在使用类来保存我获得的 XML 字段中的数据,而我需要将这些数据存储在不同的数据库表中。
  • @Tommo1977 在这种情况下,您标记为解决方案的那个很好!
【解决方案4】:

出于任何原因,如果您真的需要使用原始的 HotelDistrict 方式,您实际上不需要新类,您可以使用 Tuple<Hotel, District> 来存储对,以及这些元组的列表 (例如List<Tuple<Hote, District>>) 来存储这些对的列表。

但正如 Rohit Vats 所说,存在 *-1 关系,因此最好将区域作为一个字段进行引用,因此如果您没有使用原始方法的具体原因,我推荐他的方法。

【讨论】:

    【解决方案5】:

    作为此处其他出色答案的替代方案,如果您更喜欢具有松散耦合对象的更明确的域模型,您还可以执行以下操作。 (我假设每家酒店一次只能在一个地区。)

    class Hotel
        int HotelId
        int DistrictId
        ...
    
    class District
        int DistrictId
        ...
    
    class HotelsInDistrict
        int DistrictId
        List<int> HotelIds
    

    好处:它是松散耦合的,您不需要摆弄像巨大的对象图、延迟/急切加载等痛苦的东西。它符合实际业务领域,而不仅仅是数据容器。它是松散耦合的,可以轻松修改。

    缺点:它不容易映射到您的数据库表。但是,如果它不仅仅是一组面向数据的“类”,这些“类”只是表的表示,那么没有真正的对象模型可以做到。

    也就是说,我真的向所有对对象建模感兴趣的人推荐一本书:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多