如何创建两个对象的关系,其中两个对象互相拥有参考?

时间:2013-06-08 19:15:43

标签: c#

重写问题。

基本上我有这两个类:

class Show {
 public List<Episode> Episodes{ get; set; }
}

class Episode {
 public Show Show{ get; set; }
}

当我在节目中添加一集时,我将不得不创建一个新的剧集对象。然而,当我这样做时,我还必须填写节目,它变成了一个循环问题。如何在剧集中添加一集,其中该剧集也会引用该剧集的参考,而不会在一个永恒的圈子中结束?

我想我遗漏了一些重要信息:

我有一个为我创建视图模型的工厂。当我想要一个节目列表时,请在列表中的每个节目上调用方法CreateShowViewModel。这种方法如下:

    public ShowViewModel CreateShowViewModel(Show show) {
        return new ShowViewModel {
            ShowID = show.ShowID,
            Title = show.Title,
            Episodes = CreateEpisodeViewModels(show.Episodes)
        };
    }

当必须实例化剧集时,它会调用一个方法,在每集上执行以下功能:

    public EpisodeViewModel CreateEpisodeViewModel(Episode episode) {
        return new EpisodeViewModel {
            ShowID = episode.ShowID,
            EpisodeID = episode.EpisodeID,
            Title = episode.Title,
            Show = CreateShowViewModel(episode.Show)
        };
    }

将再次创建节目,等等。这是一个循环引用,没有?

1 个答案:

答案 0 :(得分:2)

我可以看到这个问题的两个明显的解决方案。第一个只是传递一个可选的ViewModel,所以你在方法调用中打破了圆圈。像这样:

    public ShowViewModel CreateShowViewModel(Show show, List<EpisodeViewModel> episodes = null /* guessing type */) {
        var viewModel = new ShowViewModel {
            ShowID = show.ShowID,
            Title = show.Title
        };
        viewModel.Episodes = episodes ?? CreateEpisodeViewModels(show.Episodes, viewModel);
        return viewModel;
    }

    public EpisodeViewModel CreateEpisodeViewModel(Episode episode, ShowViewModel show = null) {
        var viewModel = new EpisodeViewModel {
            ShowID = episode.ShowID,
            EpisodeID = episode.EpisodeID,
            Title = episode.Title
        };
        viewModel.Show = show ?? CreateShowViewModel(episode.Show, viewModel); // this might cause a problem due to the fact that you only have 1 episode, and not all of them.
        return viewModel;
    }

另一种方法是从Show - &gt; ShowViewModelEpisode - &gt; EpisodeViewModel添加一些兑现。我建议您使用ConditionalWeakTable

有些事情如下:

static ConditionalWeakTable<Show, ShowViewModel> _shows = new ConditionalWeakTable<Show, ShowViewModel>();
static ShowViewModel GetForShow(Show show)
{
     return _shows.GetValue(show, s => CreateShowViewModel(s));
} // do the same for episode.