Nếu tôi có ba thực thể, Project, ProjectRole và Person, trong đó một Person có thể là thành viên của các Project khác nhau và nằm trong các Role khác nhau (chẳng hạn như "Project Lead", hoặc "Project Member"). một mối quan hệ?Làm cách nào để bạn mô hình hóa vai trò/mối quan hệ với Domain Driven Design?
Trong cơ sở dữ liệu, tôi hiện có các trình tạo tab sau: Project, Person, ProjectRole Project_Person với PersonId & ProjectId là PK và ProjectRoleId như một mối quan hệ FK.
Tôi thực sự thua lỗ ở đây vì tất cả các mô hình miền tôi đưa ra dường như phá vỡ một số quy tắc "DDD". Có bất kỳ 'tiêu chuẩn' nào cho vấn đề này không?
Tôi đã xem xét Mô hình đối tượng được sắp xếp hợp lý và có ví dụ về dự án và ProjectMember trông như thế nào, nhưng AddProjectMember() trong Project sẽ gọi ProjectMember.AddProject(). Vì vậy, dự án có một danh sách các ProjectMembers, và mỗi ProjectMember trong trở lại có một tham chiếu đến dự án. Có vẻ hơi phức tạp với tôi.
cập nhật
Sau khi đọc thêm về chủ đề này, tôi sẽ thử như sau: Có vai trò riêng biệt, hoặc tốt hơn, mối quan hệ mô hình, mà là của một vai trò loại nhất định trong tên miền của tôi. Ví dụ, ProjectMember là một vai trò riêng biệt cho chúng ta biết điều gì đó về mối quan hệ mà một người chơi trong một dự án. Nó chứa một ProjectMembershipType cho chúng ta biết thêm về Role mà nó sẽ chơi. Tôi biết chắc chắn rằng mọi người sẽ phải đóng vai trò bên trong một dự án, vì vậy tôi sẽ mô hình mối quan hệ đó.
ProjectMembershipTypes có thể được tạo và sửa đổi. Đây có thể là "Nhà lãnh đạo dự án", "Nhà phát triển", "Cố vấn bên ngoài" hoặc một điều gì đó khác.
Một người có thể có nhiều vai trò bên trong một dự án và những vai trò này có thể bắt đầu và kết thúc vào một ngày nhất định. Các mối quan hệ như vậy được mô hình hóa bởi lớp ProjectMember.
public class ProjectMember : IRole
{
public virtual int ProjectMemberId { get; set; }
public virtual ProjectMembershipType ProjectMembershipType { get; set; }
public virtual Person Person { get; set; }
public virtual Project Project { get; set; }
public virtual DateTime From { get; set; }
public virtual DateTime Thru { get; set; }
// etc...
}
ProjectMembershipType: ie. "Project Manager", "Developer", "Adviser"
public class ProjectMembershipType : IRoleType
{
public virtual int ProjectMembershipTypeId { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
// etc...
}
Tôi không biết, điều đó là có thể, tôi không chắc chắn ý bạn là gì – kitsune
Tôi sợ tôi hẹn hò từ thời đại cơ sở dữ liệu quan hệ nhưng ăn quá nhiều OOD ... Tôi đang đề cập đến 'Giải pháp thứ hai' Câu trả lời của Jamie. – xtofl