Si tengo tres entidades, Project, ProjectRole y Person, donde una Persona puede ser miembro de diferentes Proyectos y estar en diferentes Roles de Proyecto (como "Project Lead" o "Project Member"), ¿cómo modelaría tales ¿una relación?¿Cómo se modelan los roles/relaciones con el Diseño Dirigido por Dominio en mente?
En la base de datos, actualmente tengo los siguientes tablers: Project, Person, ProjectRole Project_Person con PersonId & ProjectId como PK y ProjectRoleId como una relación FK.
Estoy realmente perdido aquí ya que todos los modelos de dominio que se me ocurren parecen romper alguna regla de "DDD". ¿Hay algún 'estándar' para este problema?
Eché un vistazo a un Modelado simplificado de objetos y hay un ejemplo de cómo se verían Project y ProjectMember, pero AddProjectMember() en Project llamaría ProjectMember.AddProject(). Entonces Project tiene una Lista de Miembros del Proyecto, y cada ProjectMember a cambio tiene una referencia al Proyecto. Parece un poco complicado para mí.
actualización
Después de leer más sobre este tema, voy a tratar lo siguiente: Hay distintas funciones, o mejor, relaciones de modelos, que son de un cierto tipo de papel dentro de mi dominio. Por ejemplo, ProjectMember es un rol distinto que nos dice algo acerca de la relación que una persona juega dentro de un proyecto. Contiene un ProjectMembershipType que nos dice más sobre el rol que jugará. Sé con certeza que las personas tendrán que desempeñar papeles dentro de un proyecto, por lo que modelaré esa relación.
ProjectMembershipTypes se pueden crear y modificar. Estos pueden ser "Líder de proyecto", "Desarrollador", "Asesor externo" o algo diferente.
Una persona puede tener muchos roles dentro de un proyecto, y estos roles pueden comenzar y finalizar en una fecha determinada. Tales relaciones son modeladas por la clase 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. "Gerente de Proyecto", "desarrolladores", "asesor"
public class ProjectMembershipType : IRoleType
{
public virtual int ProjectMembershipTypeId { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
// etc...
}
No tengo idea, eso es posible, no estoy seguro de lo que quieres decir – kitsune
Me temo que soy de la era de la base de datos relacional pero comí demasiado OOD ... Me refiero a la 'Segunda Solución' en La respuesta de Jamie. – xtofl