C#类设计 - 我应该考虑放置“项目”类

时间:2012-01-21 07:37:13

标签: c# asp.net .net class-design hierarchy

我正在为项目管理应用程序创建一个类库。我将向您简要介绍如何设置所有实体以帮助解决问题。

user在注册期间订阅了plan。每个计划都包含modules/applications,他可以在成功验证其帐户后使用。 ProjectCompanyPlans是我为其创建类库的模块,这些是在用户生命周期的每个阶段都存在的模块。角色确定用户可以执行的操作。每个公司(只有一个用户)可以容纳许多项目,每个项目都有专门的项目负责人和他的资源。项目负责人是另一个privileges/Roles更高的用户。现在这里是令人困惑的部分,因为对我来说似乎都很好:我应该遵循哪个类层次结构 1 2

1

User

  - Subscriptions ( List<> )

  - Projects ( List<> )
      - Client ( Client )
      - ProjectLead( User )
      - Resources(List<>)

2

Application

   - Projects ( List<> )

     - Client ( Client )
     - ProjectLead ( User )
     - Resources ( List<> )

User

  - GetProjects ( List <Project> )

混乱几乎没有到达这一点,客户端通过外键ProjectId与项目相关联。因此,在为Client创建类时,

  

表示客户端所属的项目应该在Client类中创建Project Class还是应该将客户端放在   项目类。

1 个答案:

答案 0 :(得分:2)

我是否理解你很困惑哪个对象应与另一个对象有关系,如:

选项1:用户HAS项目(他是LEAD) 选项2:项目是用户(领导者)

还有更多。

好消息是:你不必选择。您可以编写双向关系。 有几种方法可以实现这一点。

因为你谈论外键,我是否正确地假设你使用后端数据库来保存对象?在这种情况下,您可以使用像Entity Framework这样的对象关系数据库映射器(ORM)。如果没有,你将不得不自己做一些工作,这是我个人应避免的;)

实体框架

您只需先编写包含所有关系的数据库,然后让实体框架为您生成相应的类。所有这些类都有双向关系。

实施例

你有两张桌子:

  • 用户
    • id:int
    • 姓名:nvarchar(50)
  • 项目
    • id:int
    • LeadUserId:对Users.id的FOREIGN KEY
    • 姓名:nvarchar(50)

实体框架会将其转换为两个类,如此

  • 用户

    • id:int
    • 名称:字符串
    • 项目:列表
  • 项目

    • id:int
    • 名称:字符串
    • 用户:用户

现在,例如,将Project对象的“User”字段设置为其他用户时,项目将自动从原始用户的“项目”列表中删除,并添加到新用户的“项目”列表中。

您可以通过在数据库上下文对象上调用.SaveChanges()方法来持久更改数据库。

编写自己的双向关联

双向关系的主要问题是你必须保持一致性。通过简单的一对一关系,它并没有那么糟糕,但是通过一对多关系(就像这里的情况,一个用户到多个项目),这有点困难。

下面你会发现一个使用相当优秀的ObservableCollection类的实现。

项目类

public class Project {
    public string Name { get; set; }

    private User _leadUser;
    public User LeadUser {
        get { return _leadUser; }
        set {
            if (_leadUser != value) {
                if (_leadUser != null) {
                    _leadUser.Projects.Remove(this);
                    if (!value.Projects.Contains(this)) {
                        value.Projects.Add(this);
                    }
                }
                _leadUser = value;
            }
        }
    }
}

用户类

public class User {

    public string Name { get; set; }

    private ObservableCollection<Project> _projects = new ObservableCollection<Project>();
    public ObservableCollection<Project> Projects { get { return _projects; } }

    public User() {
        Projects.CollectionChanged += OnProjectCollectionChanged;
    }

    protected void OnProjectCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
        var projects = sender as IEnumerable<Project>;
        switch (e.Action) {
            case NotifyCollectionChangedAction.Add:
                foreach (var project in projects) {
                    if (project.LeadUser != this) {
                        project.LeadUser = this;
                    }
                }
                break;
            case NotifyCollectionChangedAction.Move:
                break;
            case NotifyCollectionChangedAction.Remove:
                foreach (var project in projects) {
                    if (project.LeadUser == this) {
                        project.LeadUser = null;
                    }
                }
                break;
            case NotifyCollectionChangedAction.Replace:
                break;
            case NotifyCollectionChangedAction.Reset:
                break;
            default:
                break;
        }
    }
}

希望这篇文章对你有用。