2012-02-13 22 views
1

我在网站上有标签:电影院,音乐会,俱乐部,剧院,儿童,其他。每个标签显示适当的事件和时间表。 这是我的目标:
对于电影:
FilmCinemaCinemaSchedule
剧院:
PerformanceTheaterTheaterSchedule
等。组织业务对象和代码复制

现在考虑演唱会:
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,等等)。

如何避免此重复?

谢谢,对不起我的英语。

回答

3

感觉就像你需要用不同的方式建模。

也许你可以有一个Venue对象,表示事情发生在(与子类如CinemaTheatre)的物理位置,一个Event对象,它表示的东西(如FilmPlay)和Performance代表联接这两个模型(因此将有两个外键,并可能是一个时间领域)。

1

我的第一个想法是,你应该有所谓的事件(或类似的东西只是大脑在这里激荡)的基础对象和一个将它延伸到作为一个电影事件,音乐会事件等时的建筑对象OCP

关于你的第二(或者是它第一次?太少咖啡太多时间)的问题,我看不出什么错与具有特定事件与几类连接的表。

2

电影院,剧院和俱乐部shold有一个具有IList的返回时间表你相同的父。对于存储库也是一样,你可以将GetFilmsForPeriod更改为GetObjectsForPeriod,并将其移至BaseRepository。俱乐部和剧院都可以举办IList音乐会。尝试将对象的一些类似属性合并到父项中以避免重复编码。

由于电影是你可以把它无论是在电影和儿童,因为它是引用类的类。