Это своего рода сложный вопрос, и я пробовал так много углов, что не могу вспомнить, что у меня было, и что я еще не пробовал. Но в основном мой проект состоит из базовых классов футбольной лиги. У меня есть следующие занятия:
Лига - абстрактный базовый класс для лиги в моей библиотеке Команда - абстрактный базовый класс для команды в моей библиотеке
FootballLeague - производный от League (может быть любой другой тип лиги, например, BaseballLeague, SoccerLeague и т. Д.) FootballTeam - производный от Team (то же, что и выше)
По сути, я хотел бы иметь список команд в классе League, чтобы у меня были более общие методы в этом классе, которые могли бы работать только с объектами Team. А затем в моем FootballLeague иметь возможность ссылаться на тот же список, за исключением возврата объектов FootballTeam (которые действительно содержатся в списке).
Вот моя реализация на очень базовом уровне:
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>();
}
}
Это работает практически так, как я хочу, за исключением проблемы с NHibernate.
1) Когда я загружаю объект FootballLeague, он также загружает все объекты FootballTeam. Если я удалю объявление mTeams в базовом классе и просто использую автоматическое получение / установку для IList в объекте FootballLeague, ленивая загрузка сработает, и мои команды не загрузятся, пока не получат доступ к коллекции. Таким образом, наличие этой переменной-члена, к которой список обращается в базовом классе, заставляет NHiberate обходить ленивую загрузку.
Эта реализация - это то, как вы бы справились с этим типом библиотеки. В то время как у вас есть абстрактные базовые классы, которые должны иметь функциональные возможности в списках, но производные классы также должны иметь доступ к более специализированным версиям списка? Если нет, как мне это реализовать, чтобы он работал с NHibernate?