배경 :
서버 응용 프로그램을 설계하고 다른 하위 시스템에 대해 별도의 dll을 만듭니다. 일을 단순화하기 위해 두 개의 하위 시스템이 있다고 가정 해 봅시다. 1) Users
2)Projects
사용자의 공용 인터페이스에는 다음과 같은 방법이 있습니다.
IEnumerable<User> GetUser(int id);
그리고 프로젝트의 공용 인터페이스에는 다음과 같은 방법이 있습니다.
IEnumerable<User> GetProjectUsers(int projectId);
예를 들어 특정 프로젝트의 사용자를 표시해야 할 경우 전화를 걸면 데이터 GetProjectUsers
그리드 또는 이와 유사한 정보를 표시 할 수있는 충분한 정보가있는 객체를 반환 할 수 있습니다 .
문제 :
이상적에서, Projects
서브 시스템은 또한 사용자 정보를 저장 안하고 그냥 프로젝트에 참여하고있는 사용자의 ID를 저장해야합니다. 서비스를 제공하기 위해 GetProjectUsers
, 그것은 호출해야 GetUser
의 Users
자체 데이터베이스에 저장된 각 사용자 ID에 대한 시스템. 그러나 여기에는 많은 별도의 GetUser
호출 이 필요하므로 User
서브 시스템 내부에 많은 별도의 SQL 쿼리가 발생합니다 . 나는 이것을 실제로 테스트하지는 않았지만이 수다스러운 디자인은 시스템의 확장성에 영향을 미칩니다.
내가 옆 서브 시스템의 분리를 넣어, 난 할 수 두 시스템에 의해 하나의 스키마 accessable 한 모든 정보를 저장하고 Projects
간단하게 할 수있는 JOIN
하나의 쿼리에서 모든 프로젝트 사용자를 얻을 수 있습니다. 쿼리 결과에서 개체 Projects
를 생성하는 방법도 알아야합니다 User
. 그러나 이것은 많은 장점을 가진 분리를 깨뜨립니다.
질문 :
누구나 개별 GetUser
통화 를 피하면서 분리를 유지할 수있는 방법을 제안 할 수 있습니까 GetProjectUsers
?
예를 들어, 내가 생각한 것 중 하나는 사용자가 외부 시스템에 레이블-값 쌍으로 사용자에게 "태그"태그를 지정하고 특정 값을 가진 사용자를 요청하는 기능을 제공하는 것입니다.
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
그런 다음 프로젝트 시스템은 각 사용자가 프로젝트에 추가 될 때 태그를 지정할 수 있습니다.
AddUserTag(userId,"project id", myProjectId.ToString());
GetProjectUsers 중에는 단일 프로젝트에서 모든 프로젝트 사용자를 요청할 수 있습니다.
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
확실하지 않은 부분은 다음과 같습니다. 예, 사용자는 프로젝트를 무시하지만 실제로 프로젝트 멤버십에 대한 정보는 프로젝트가 아닌 사용자 시스템에 저장됩니다. 나는 자연스럽지 않아서 여기에 내가 놓친 큰 단점이 있는지 확인하려고합니다.