如何创建两个对象之间的关系,其中两个对象都持有彼此的引用
本文关键字:两个 对象 引用 之间 何创建 创建 关系 | 更新日期: 2023-09-27 18:17:36
重写问题。
基本上我有这两个类:
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)
};
}
将重新创建该节目,等等。这是一个循环参考,不是吗?
这个问题有两个明显的解决方案。第一个方法只是传递一个可选的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
-> ShowViewModel
和Episode
-> 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.