组织业务对象和代码重复

时间:2012-02-13 15:25:52

标签: c# architecture

我在网站上有标签:电影院,音乐会,俱乐部,剧院,儿童,其他。每个选项卡都显示相应的事件和计划。 这是我的目标:
对于电影院:
FilmCinemaCinemaSchedule
剧院:
PerformanceTheaterTheaterSchedule
等等。

现在考虑音乐会:
ConcertConcertPlaceConcertPlaceSchedule 但这不正确,因为音乐会可能在俱乐部或剧院(例如)。 俱乐部的情况也是如此。会举办各种活动:音乐会和派对。

那么,组织课程的最佳方法是什么?另一个例子:我们有电影“穿靴子的猫”。一方面,这部电影,另一方面是卡通(儿童选项卡)。现在电影出现在“电影”和“儿童”中需要创作两次。

另一个问题,我将在示例中展示。

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 个答案:

答案 0 :(得分:3)

感觉就像你需要以不同的方式对它进行建模。

也许你可以有一个Venue对象代表一个物理位置,它发生在(带有例如CinemaTheatre的子类),一个代表Event的对象那些东西(例如FilmPlay)和Performance代表这两个模型的连接(因此将有两个外键,可能是一个时间字段)。< / p>

答案 1 :(得分:2)

Cinema,Theatre和Club shold与拥有IList的父母一样,为您返回时间表。对于存储库来说,似乎可以将GetFilmsForPeriod更改为GetObjectsForPeriod并将其移至BaseRepository。俱乐部和剧院均可举办IList音乐会。尝试将对象的一些类似属性合并到父对象中,以避免双重编码。

由于电影是一个课程,你可以在电影和儿童中都有它,因为它是参考课程。

答案 2 :(得分:1)

我的第一个想法是,你应该有一个名为Event的基础对象(或类似的东西,这里只是头脑风暴),并且会有一个对象将它扩展为Cinema事件,音乐会事件等等构建于{ {3}}。

在你的第二个(或者它是第一个?太少咖啡太多时间)问题我没有看到有一个表连接指定的事件与几个类别的任何问题。