From c47a4b2e15cd1e46f95df947d8857d00ab9041a7 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 24 Jul 2020 20:34:56 +0200 Subject: [PATCH] Fixing circular dependencies --- .../Repositories/SeasonRepository.cs | 17 +++++---- .../Repositories/ShowRepository.cs | 35 ++++++++++--------- Kyoo/Startup.cs | 20 +++++------ 3 files changed, 39 insertions(+), 33 deletions(-) diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index cec35eeb..f197d7c8 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Kyoo.Models; using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Controllers { @@ -14,20 +15,20 @@ namespace Kyoo.Controllers { private readonly DatabaseContext _database; private readonly IProviderRepository _providers; - private readonly IEpisodeRepository _episodes; + private readonly Lazy _episodes; private readonly IShowRepository _shows; protected override Expression> DefaultSort => x => x.SeasonNumber; public SeasonRepository(DatabaseContext database, IProviderRepository providers, - IEpisodeRepository episodes, - IShowRepository shows) + IShowRepository shows, + IServiceProvider services) : base(database) { _database = database; _providers = providers; - _episodes = episodes; + _episodes = new Lazy(services.GetRequiredService); _shows = shows; } @@ -36,14 +37,16 @@ namespace Kyoo.Controllers { _database.Dispose(); _providers.Dispose(); - _episodes.Dispose(); + if (_episodes.IsValueCreated) + _episodes.Value.Dispose(); } public override async ValueTask DisposeAsync() { await _database.DisposeAsync(); await _providers.DisposeAsync(); - await _episodes.DisposeAsync(); + if (_episodes.IsValueCreated) + await _episodes.Value.DisposeAsync(); } public override Task Get(string slug) @@ -161,7 +164,7 @@ namespace Kyoo.Controllers await _database.SaveChangesAsync(); if (obj.Episodes != null) - await _episodes.DeleteRange(obj.Episodes); + await _episodes.Value.DeleteRange(obj.Episodes); } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 3e9d9710..5d9f3af8 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Kyoo.Models; using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Controllers { @@ -16,17 +17,16 @@ namespace Kyoo.Controllers private readonly IPeopleRepository _people; private readonly IGenreRepository _genres; private readonly IProviderRepository _providers; - private readonly ISeasonRepository _seasons; - private readonly IEpisodeRepository _episodes; + private readonly Lazy _seasons; + private readonly Lazy _episodes; protected override Expression> DefaultSort => x => x.Title; public ShowRepository(DatabaseContext database, IStudioRepository studios, IPeopleRepository people, IGenreRepository genres, - IProviderRepository providers, - ISeasonRepository seasons, - IEpisodeRepository episodes) + IProviderRepository providers, + IServiceProvider services) : base(database) { _database = database; @@ -34,8 +34,8 @@ namespace Kyoo.Controllers _people = people; _genres = genres; _providers = providers; - _seasons = seasons; - _episodes = episodes; + _seasons = new Lazy(services.GetRequiredService); + _episodes = new Lazy(services.GetRequiredService); } public override void Dispose() @@ -45,8 +45,10 @@ namespace Kyoo.Controllers _people.Dispose(); _genres.Dispose(); _providers.Dispose(); - _seasons.Dispose(); - _episodes.Dispose(); + if (_seasons.IsValueCreated) + _seasons.Value.Dispose(); + if (_episodes.IsValueCreated) + _episodes.Value.Dispose(); } public override async ValueTask DisposeAsync() @@ -56,8 +58,10 @@ namespace Kyoo.Controllers await _people.DisposeAsync(); await _genres.DisposeAsync(); await _providers.DisposeAsync(); - await _seasons.DisposeAsync(); - await _episodes.DisposeAsync(); + if (_seasons.IsValueCreated) + await _seasons.Value.DisposeAsync(); + if (_episodes.IsValueCreated) + await _episodes.Value.DisposeAsync(); } public override async Task> Search(string query) @@ -168,15 +172,14 @@ namespace Kyoo.Controllers if (obj.LibraryLinks != null) foreach (LibraryLink entry in obj.LibraryLinks) _database.Entry(entry).State = EntityState.Deleted; - - await _database.SaveChangesAsync(); - // TODO fix circular references of Show/Season/Episode Repository. + await _database.SaveChangesAsync(); + if (obj.Seasons != null) - await _seasons.DeleteRange(obj.Seasons); + await _seasons.Value.DeleteRange(obj.Seasons); if (obj.Episodes != null) - await _episodes.DeleteRange(obj.Episodes); + await _episodes.Value.DeleteRange(obj.Episodes); } } } \ No newline at end of file diff --git a/Kyoo/Startup.cs b/Kyoo/Startup.cs index 4c3984b9..b0c08eb5 100644 --- a/Kyoo/Startup.cs +++ b/Kyoo/Startup.cs @@ -133,16 +133,16 @@ namespace Kyoo }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddSingleton();