道歉,如果这已经被问到了,但我看了一眼,找不到任何东西。我试图找出在C#中模拟以下内容的最佳方法。我勾勒出了一些想法,但没有一个感觉正确。
我创建了一个抽象的'Person'类。我的应用程序将拥有客户和员工。 明显, 客户是一个人 员工是个人
最终,我想使用Fluent NHibernate进行映射。我一直认为这应该很简单,我只是不直接思考,但是我可以使用哪种模式来解决这个问题。
感谢。
答案 0 :(得分:11)
您的问题是您的第一个前提:客户 不 一个人(也不是员工)。正如你所猜测的那样,一个人既可以是一个人,也可以是两个人。所以这不是你想要的“is-a”(继承)关系,它是一个“has-a”(组合)关联。
我们在这方面没有得到帮助,因为你所描述的是一个典型的例子,当我们在大学里学习OO编程,阅读书籍等时,我们会被教导,而且它不是一个好的模型。
人 零个或多个角色。角色可以是客户,供应商,员工,经理或其他任何人。
如果您遵循该模型,您最终会得到更灵活(更准确)的内容。
我在这里描述的内容在CRM系统中非常常见,并且往往被称为Party系统。一般的想法是:
示例:
这个主题有很多变化。
答案 1 :(得分:0)
感谢您的回复,这真的有助于让我的头脑清醒。我试图根据你的建议对我的要求进行建模,所以这是我在模型上的第一次传递。
我把它放在这里有两个原因;
我愿意接受反馈,并建议我如何更好地建模,以确保它既“灵活”又“准确”
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;}
}