0

抱歉,如果这已经被问过了,但是我已经看了看,找不到任何东西。我正在尝试找出在 C# 中对以下内容进行建模的最佳方法。我已经勾勒出一些想法,但没有一个感觉是对的。

我创建了一个抽象的“人”类。我的应用程序将有客户和员工。显然,客户是一个人,员工是一个人

  • 员工不必是客户。
  • 即使最初没有将客户设置为员工,客户也可以成为员工。
  • 员工可以成为客户
  • 一个人可以不再是员工,但仍然是客户
  • 一个人可以不再是客户,但仍然是员工

最终,我想使用 Fluent NHibernate 来映射它。我一直认为这应该很容易,我只是没有直接思考,但有没有一种我可以使用的模式来解决这个问题。

谢谢。

4

2 回答 2

11

您的问题是您的第一个前提:客户不是人(也不是员工)。正如您正确推测的那样,一个人可以是其中之一,也可以是两者,也可以不是。所以这里不是你想要的“is-a”(继承)关系,而是“has-a”(组合)关联。

在这方面我们没有得到帮助,因为您所描述的是一个典型的例子,我们在大学学习 OO 编程时,从阅读书籍等中学到,这不是一个好的模型。

一个人有零个或多个角色。角色可以是客户、供应商、员工、经理或其他。

如果您遵循该模型,您最终会得到更灵活(和准确)的东西。

我在这里描述的内容在 CRM 系统中极为常见,并且往往被称为 Party 系统。总体思路是:

  • 当事人是一个人或一群人的关键实体;
  • Partieis 有两个(或更多)子类型:Person 和 Organization 很常见;
  • 一方有零个或多个角色;
  • 有时,各方相互关联,但更典型的是角色相互关联。

例子:

  • Joe Smith 是一个 Person,是 Party 的一个子类型;
  • Acme Corp 是一个组织,是 Party 的一个子类型;
  • Joe Smith 的角色是 Employee;
  • Acme Corp 具有雇主的角色;
  • 员工 Joe 和雇主 Acme 之间存在角色雇佣关系(一种角色关系)。

这个主题有很多变化。

于 2009-11-08T06:07:09.003 回答
0

感谢您的回复,它确实帮助我理清了思路。我试图根据您的建议对我的要求进行建模,所以这是我第一次通过模型。

我把它放在这里有两个原因;

  1. 我敢肯定,如果我问了这个问题,其他人也会有同样的问题,所以这可能会有所帮助或成为他们的起点。
  2. 我愿意接受反馈和任何关于如何更好地建模以确保它既“灵活”又“准确”的建议

    public class Parties {
        Person Person {get; set;}
        Organization Organisation {get; set;}
        public Parties(Person person, Organization organisation) {
            Person = person;
            Organisation = organisation;
        }
    }
    
    public interface Person {}
    public interface Organization {}
    
    public class Business : Organization {}
    
    public class Contact: Person {
        public string FirstName{get; set;}
        public string LastName {get; set;}
        List<Role>roles = new List<Role>();
            public Contact() {}
            public Contact(Clients client)
                : this() {
                roles.Add(client); 
            }
            public Contact(Employees employee)
                : this() {
                roles.Add(employee); 
            }
        }
    
    public interface Role {}
    
    public interface Clients: Role{}
    public class BronzeClient: Clients{
        public DateTime lastClass {get; set;}
    }
    public class SilverClient : Clients {
        public DateTime lastClass {get; set;}
    }
    public class GoldClient : Clients {
        public DateTime lastClass {get; set;}
    }
    
    public interface Employees : Role {}
    public class Employee: Employees{
        public string EmployeeID{ get; set;}
    }
    public class SeniorManager : Employees {
        public string EmployeeID {get; set;}
    }
    
于 2009-11-09T23:05:38.213 回答