重写问题。
基本上我有这两个类:
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)
};
}
将再次创建节目,等等。这是一个循环引用,没有?
答案 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; ShowViewModel
和Episode
- &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.