一对一的方法或其他什么?

时间:2012-11-25 18:33:56

标签: c# oop

假设我想跟踪某些人物及其职业历史记录。 我应该遵循这种方法吗?

public class Person
{
  public int Id {get; set;}
  public string Name {get; set;}
  public Career Career {get; set;}

  public Person()
  {...}
}

public class Career 
{
   public Person Person {get; set;}
   public IList<Company> Companies {get; set;}
   ... 
}

由于这是一对一的方法,一个人可以拥有一个职业 问题是:我是否需要双向链接,或者更好的是如何链接这两个对象?

由于

3 个答案:

答案 0 :(得分:1)

您正在此处创建循环依赖项,也许您应该从Career类中删除Person属性。或者相反;从Person移除Career

public class Person
{
    public int Id {get; set;}
    public string Name {get; set;}

    public Person()
    {...}
}

答案 1 :(得分:1)

数据将被保留(如果有的话)在如何表示数据方面发挥着重要作用。根据您的问题,您是否将此信息存储在数据库,xml文件或其他介质中尚不清楚。

如果您将其存储在数据库中,那么Career将不会有一个完整的人物对象,而是具有作为外键的PersonID。

在纯OOP方法中,Career对象中不会有person对象。一个人有事业,职业生涯没有一个人。

您可以通过多种方式表示数据,但这完全取决于您计划如何使用和存储数据。

答案 2 :(得分:1)

这主要取决于两件事:您的应用程序中的聚合域是什么以及您将如何坚持这一点?

如果您基于职业生涯将应用程序建模为核心概念,那么Person无需了解职业生涯。这可以采取以下形式:

public class Person
{
  public string Name { get; set; }
  ...
}

public class Career
{
   public Person Person { get; set; }
   public IList<Company> Companies { get; set; }
   ...
}

但另一方面,没有人的职业似乎有点奇怪。如果你专注于人们他们的职业,那么Career课程可能是多余的:

public class Person
{
  public string Name { get; set; }
  public IList<Company> Career { get; set; }
}

<强>持久性

当然,持久性方法会影响你的模型。我在上面的评论中看到你打算存储在数据库中。但目前尚不清楚什么样的数据库。例如,如果您使用文档数据库(例如RavenDB),则可以直接存储上述两种模型变体。

但是如果您使用关系数据库以及可能的Entity Framework或其他ORM,您可能需要包含一些数据库ID和外键属性,具体取决于ORM将采用多少魔法。