如何创建两个对象之间的关系,其中两个对象都持有彼此的引用

本文关键字:两个 对象 引用 之间 何创建 创建 关系 | 更新日期: 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 -> ShowViewModelEpisode -> 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.