我在网站上有标签:电影院,音乐会,俱乐部,剧院,儿童,其他。每个选项卡都显示相应的事件和计划。
这是我的目标:
对于电影院:
Film
,Cinema
,CinemaSchedule
剧院:
Performance
,Theater
,TheaterSchedule
等等。
现在考虑音乐会:
Concert
,ConcertPlace
,ConcertPlaceSchedule
但这不正确,因为音乐会可能在俱乐部或剧院(例如)。
俱乐部的情况也是如此。会举办各种活动:音乐会和派对。
那么,组织课程的最佳方法是什么?另一个例子:我们有电影“穿靴子的猫”。一方面,这部电影,另一方面是卡通(儿童选项卡)。现在电影出现在“电影”和“儿童”中需要创作两次。
另一个问题,我将在示例中展示。
This is my repository for `Film`:
public class FilmRepository:BaseRepository<Film>
{
public FilmRepository(DatabaseContext database) : base(database)
{
}
/// <summary>
/// Loads films for specific period
/// </summary>
/// <param name="period"></param>
/// <returns></returns>
public IList<Film> GetFilmsForPeriod(PeriodEvent period)
{
switch (period)
{
case PeriodEvent.All:
return GetAllFilms();
case PeriodEvent.Today:
return GetFilmsForToday();
case PeriodEvent.Tomorrow:
return GetFilmsForTomorrow();
case PeriodEvent.Week:
return GetFilmsForWeek();
case PeriodEvent.FewWeek:
return GetFilmsForFewWeek();
case PeriodEvent.Month:
return GetFilmsForMonth();
case PeriodEvent.FewMonth:
return GetFilmsForFewMonth();
default:
return GetFilmsForToday();
}
}
// load films for today
private IList<Film> GetFilmsForToday()
{
return
Database.Films.Where(c => c.CinemaSchedules.Any(s =>
s.ShowDate.Value.Date == DateTime.Now.Date)).ToList();
}
//implementation another methods from above.
}
每个存储库都有相同的方法。相反,CinemaSchedule
的一个区别是TheaterSchedule
(或ClubSchedule
,依此类推。)
如何避免这种重复?
谢谢,对不起我的英语。
答案 0 :(得分:3)
感觉就像你需要以不同的方式对它进行建模。
也许你可以有一个Venue
对象代表一个物理位置,它发生在(带有例如Cinema
,Theatre
的子类),一个代表Event
的对象那些东西(例如Film
,Play
)和Performance
代表这两个模型的连接(因此将有两个外键,可能是一个时间字段)。< / p>
答案 1 :(得分:2)
Cinema,Theatre和Club shold与拥有IList的父母一样,为您返回时间表。对于存储库来说,似乎可以将GetFilmsForPeriod更改为GetObjectsForPeriod并将其移至BaseRepository。俱乐部和剧院均可举办IList音乐会。尝试将对象的一些类似属性合并到父对象中,以避免双重编码。
由于电影是一个课程,你可以在电影和儿童中都有它,因为它是参考课程。
答案 2 :(得分:1)
我的第一个想法是,你应该有一个名为Event的基础对象(或类似的东西,这里只是头脑风暴),并且会有一个对象将它扩展为Cinema事件,音乐会事件等等构建于{ {3}}。
在你的第二个(或者它是第一个?太少咖啡太多时间)问题我没有看到有一个表连接指定的事件与几个类别的任何问题。