2011-07-23 3 views
1

C'est une question compliquée et j'ai essayé tellement d'angles que je ne me souviens pas de ce que j'ai et que je n'ai pas encore essayé. Mais fondamentalement, mon projet consiste en quelques classes de base pour une ligue de football. Je les classes suivantes:NHibernate et liste générique dans la classe de base abstraite

League - classe de base abstraite pour une ligue dans ma bibliothèque équipe - classe de base abstraite pour une équipe dans ma bibliothèque

FootballLeague - dérivé de la Ligue (peut-être un autre type de ligue par exemple BaseballLeague, SoccerLeague, etc.) FootballTeam - dérivé de l'équipe (même que ci-dessus)

Fondamentalement ce que je voudrais faire est d'avoir une liste d'équipes dans la classe de la Ligue afin que je puisse avoir des méthodes plus générales dans cette classe qui peut fonctionner uniquement sur des objets Team. Et puis dans mon FootballLeague être capable de référencer cette même liste sauf récupérer les objets FootballTeam (que la liste contient vraiment).

Voici ma mise en œuvre jusqu'à présent à un niveau très basique:

public abstract class League 
{ 
    protected IList mTeams; 
} 

public abstract class Team 
{ 
    public virtual League League 
    { 
     get; 
     protected set; 
    } 
} 

public class FootballLeague : League 
{ 
     public virtual IList<FootballTeam> Teams 
     { 
      get { return this.mTeams.Cast<FootballTeam>().ToList(); } 
      protected set { this.mTeams = value.ToList(); } 
     } 

     public FootballLeague() : base() 
     { 
      this.mTeams = new List<FootballTeam>(); 
      this.mConferences = new List<FootballConference>(); 
     } 
} 

Cela fonctionne à peu près exactement ce que je veux, sauf pour un problème NHibernate.

1) Lorsque je charge un objet FootballLeague, il charge également tous les objets FootballTeam. Si je supprime la déclaration mTeams dans la classe de base et que j'utilise simplement un get/set automatique pour IList dans l'objet FootballLeague, le chargement paresseux fonctionne et mes équipes ne chargent pas avant d'avoir réellement accédé à la collection. Donc, ayant cette variable membre que la liste accède à la classe de base, NHiberate contourne le chargement paresseux. Cette implémentation est la façon dont vous géreriez ce type de bibliothèque. Considérant que vous avez des classes de base abstraites qui devraient avoir des fonctionnalités sur les listes, mais les classes dérivées devraient également être en mesure d'accéder à des versions plus spécialisées de la liste aussi bien? Si non, comment dois-je l'implémenter pour que cela fonctionne avec NHibernate?

Répondre

1
public abstract class League<T> where T : Team 
{ 
    protected IList<T> mTeams; 

    public League() 
    { 
     mTeams = new List<T>(); 
    } 
} 

public class FootballLeague : League 
{ 
} 

et carte mTeams comme IList et hasmanyToAny pour éviter les erreurs de coulée

Est-ce que ce travail pour vous?

Questions connexes