班级建模:多人,只有两个用户系统
本文关键字:两个 系统 用户 建模 多人 | 更新日期: 2023-09-27 17:56:35
在我的医院系统中有
- 病人
- 专业人员=医疗,秘书,医院工作人员 供应商
- =产品供应商
- 公司=健康计划,其他
在这四个中,只有两个可以访问该系统:专业(工作)和患者(访问您的信息)
在我的财务模块中,每个人都要包含应付账款或应收账款,我需要在我的数据库中有一个类和信息,然后我创建了我的 Person.cs类
当我有应收账款时,我会通知PersonId,例如:
public class Payment
{
public AccountType Type {get;set;} //CREDIT or DEBIT
public int PersonId {get;set;} //HERE IS PROFESSIONAL OR PATIENTS OR SUPPLIER OR COMPANY
}
目前我已经完成了
public class Company: Person {}
public class Patient: Person {}
public class Supplier: Person {}
public class Professional: Person {}
但是患者和专业人员需要访问系统,因此他们是系统的用户
我使用 asp.net identity
并且不能有两个类继承IdentityUser
我不能有 Person:IdentityUser,因为 UserName 属性和其他属性是必需的,供应商和公司无法访问系统。
我有 3 个解决方案:
解决方案1 所有组合(1-0/1)亲自.cs例如:
public class Person
{
//Common properties (Id, Name, Address..)
public User User {get;set;} //for access
public Professional Professional {get;set;}
public Company Company {get;se;t}
public Supplier Supplier {get;set;}
public Patient Patient {get;set;}
}
解决方案 2,所有班级中的人员组成,例如:
public class Patient
{
//patient properties specifics
public Person Person {get;set;}
}
public class Professional
{
//professional properties specifics
public Person Person {get;set;}
}
public class User:IdentityUser
{
//user properties specifics
public Person Person {get;set;}
}
public class Company
{
//company properties specifics
public Person Person {get;set;}
}
public class Supplier
{
//Supplier properties specifics
public Person Person {get;set;}
}
解决方案 3,仅限患者和专业人员中的用户属性
public class User: IdentityUser {}
public class Company: Person {}
public class Patient: Person
{
public int? UserId {get;set;} //nullalble
}
public class Supplier: Person {}
public class Professional: Person {
public int? UserId {get;set;} //nullalble
}
每个人都是独一无二的,将有两个角色病人只会有耐心,永远不会是专业人士或公司。其他人也一样
有什么建议吗?
代码试图对现实进行建模。您的代码是否反映了现实?
- 公司是个人吗?哈哈
- 产品供应商是一个人吗?可能,但可能不是。
- 患者和专业人员是一个人可以担任的角色,但他们并没有定义一种新的人。人类是由人组成的,而不是由病人和专业人士组成的。专业人士也可以是病人吗?我不明白为什么不。
根据您声明的业务规则,只有患者或专业角色中的人员才能成为用户。然后,一个人可能具有用户身份,并且根据其角色,可能能够使用该身份访问系统。
enum Role
{
Unknown = 0,
Patient = 1,
Professional = 2
}
class Person
{
public IEnumerable<Role> Roles { get; private set; }
public IdentityUser User { get; private set; }
}
那么谁来决定这个人是否可以登录呢?将您的业务规则封装在一个能够解决这个问题的类中。举个粗略的例子:
class Authenticator
{
public bool IsAuthenticated(Person person)
{
if (person.User == null)
return false;
if (person.Roles.Any(x => x == Role.Patient || x == Role.Professional))
return true;
return false;
}
}
等等。针对您尝试建模的现实进行设计。您可能还需要查看 ASP.Net 身份角色,因为此概念已经可供您使用,并且会将身份验证机制更接近您的身份(它们所属的位置)。