J'ai 2 dépôts:
public class UserRepository : IUserRepository
{
public IQueryable<User> GetUsers();
}
public class PostRepository : IPostRepository
{
public IQueryable<Post> GetPosts();
}
Ceci est susceptible de devenir problématique.
Vous ne voulez probablement pas simplement GetUsers
. Comme vous le dites, vous voulez que les entités enfants soient chargées avec l'entité agrégée ou de niveau supérieur. Ce qui se passera est que, selon le contexte d'utilisation - quel est votre but immédiat - vous voulez des variations sur ce User
. Vous finirez probablement avec des méthodes comme GetUsers
, 'GetUsersWithPosts
, GetUsersForImportantReport
, GetUsersForAttendingAnIceCreamSocial
, etc., etc., ad nauseam.
Ce qui manque, c'est le concept d'un rôle.
Pour quel rôle récupérez-vous l'utilisateur? Modélisez cela explicitement ici.
Commencez avec une interface de base pour votre agrégat. Propriétés de base peuvent aller ici
public interface IUser {
public Guid UserId { get; set; }
public string UserName { get; set; }
public IEnumerable<Posts> { get; set; }
}
Ajoutez des interfaces pour prendre en charge les rôles dans lesquels vous utiliserez l'utilisateur.
public interface IAddPostsToUser : IUser {
public void AddPost(Post post);
}
Et votre dépôt peut être défini comme tel:
public interface IUserRepository {
User Get<TRole>(Guid userId) where TRole : IUser;
}
Maintenant, utilisez ce rôle pour définir une stratégie de récupération;
public interface IFetchingStrategy<TRole> {
TRole Fetch(Guid id, IRepository<TRole> role)
}
Votre référentiel obtiendrait les stratégies de récupération via l'emplacement d'injection ou de service et l'extraction d'appel.Vous pouvez transmettre le référentiel pour fournir le mécanisme d'interrogation de FetchingStrategy ou demander à FetchingStrategy d'injecter ou de localiser les services dont il a besoin pour interroger.
Bien sûr, la façon dont vous interrogez dépend de votre ORM. Mais cette manière de modéliser permettra d'éviter de nombreux problèmes de chargement de graphes d'entité dans différents scénarios.
Qu'est-ce que vous utilisez pour votre ORM? NHibernate, Entity Framework ou autre chose. Cela nous aidera à vous donner une meilleure réponse. – ilivewithian
@ilivewithian EF4. –