Antecedentes:
estou projetando um aplicativo de servidor e criando DLLs separadas para diferentes subsistemas. Para simplificar, digamos que eu tenha dois subsistemas: 1) Users
2)Projects
A interface pública do usuário possui um método como:
IEnumerable<User> GetUser(int id);
E a interface pública do Projects possui um método como:
IEnumerable<User> GetProjectUsers(int projectId);
Assim, por exemplo, quando precisamos exibir os usuários para um determinado projeto, podemos chamar GetProjectUsers
e isso fornecerá objetos com informações suficientes para mostrar em um datagrid ou similar.
Problema:
Idealmente, o Projects
subsistema também não deve armazenar informações do usuário e apenas armazenar IDs dos usuários participantes de um projeto. Para atender GetProjectUsers
, ele precisa chamar GetUser
o Users
sistema para cada ID de usuário armazenado em seu próprio banco de dados. No entanto, isso requer muitas GetUser
chamadas separadas , causando muitas consultas sql separadas dentro do User
subsistema. Eu realmente não testei isso, mas ter esse design falador afetará a escalabilidade do sistema.
Se eu deixar de lado a separação dos subsistemas, poderia armazenar todas as informações em um único esquema acessível por ambos os sistemas e Projects
poderia simplesmente fazer um JOIN
para obter todos os usuários do projeto em uma única consulta. Projects
também precisaria saber como gerar User
objetos a partir dos resultados da consulta. Mas isso quebra a separação, que tem muitas vantagens.
Pergunta:
Alguém pode sugerir uma maneira de manter a separação, evitando todas essas GetUser
chamadas individuais durante GetProjectUsers
?
Por exemplo, uma idéia que eu tinha era que os usuários dessem aos sistemas externos a capacidade de "marcar" usuários com um par de rótulo-valor e solicitar usuários com um determinado valor, por exemplo:
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
Em seguida, o sistema Projetos pode marcar cada usuário à medida que são adicionados ao projeto:
AddUserTag(userId,"project id", myProjectId.ToString());
e durante GetProjectUsers, ele poderia solicitar todos os usuários do projeto em uma única chamada:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
a parte que eu não tenho certeza disso é: sim, os usuários são independentes de projetos, mas, na verdade, as informações sobre a participação no projeto são armazenadas no sistema de usuários, não em projetos. Eu simplesmente não me sinto natural, então estou tentando determinar se há uma grande desvantagem aqui que estou perdendo.