Fixing circular dependencies

This commit is contained in:
Zoe Roux 2020-07-24 20:34:56 +02:00
parent 59e72b6dca
commit c47a4b2e15
3 changed files with 39 additions and 33 deletions

View File

@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Kyoo.Models; using Kyoo.Models;
using Kyoo.Models.Exceptions; using Kyoo.Models.Exceptions;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
namespace Kyoo.Controllers namespace Kyoo.Controllers
{ {
@ -14,20 +15,20 @@ namespace Kyoo.Controllers
{ {
private readonly DatabaseContext _database; private readonly DatabaseContext _database;
private readonly IProviderRepository _providers; private readonly IProviderRepository _providers;
private readonly IEpisodeRepository _episodes; private readonly Lazy<IEpisodeRepository> _episodes;
private readonly IShowRepository _shows; private readonly IShowRepository _shows;
protected override Expression<Func<Season, object>> DefaultSort => x => x.SeasonNumber; protected override Expression<Func<Season, object>> DefaultSort => x => x.SeasonNumber;
public SeasonRepository(DatabaseContext database, public SeasonRepository(DatabaseContext database,
IProviderRepository providers, IProviderRepository providers,
IEpisodeRepository episodes, IShowRepository shows,
IShowRepository shows) IServiceProvider services)
: base(database) : base(database)
{ {
_database = database; _database = database;
_providers = providers; _providers = providers;
_episodes = episodes; _episodes = new Lazy<IEpisodeRepository>(services.GetRequiredService<IEpisodeRepository>);
_shows = shows; _shows = shows;
} }
@ -36,14 +37,16 @@ namespace Kyoo.Controllers
{ {
_database.Dispose(); _database.Dispose();
_providers.Dispose(); _providers.Dispose();
_episodes.Dispose(); if (_episodes.IsValueCreated)
_episodes.Value.Dispose();
} }
public override async ValueTask DisposeAsync() public override async ValueTask DisposeAsync()
{ {
await _database.DisposeAsync(); await _database.DisposeAsync();
await _providers.DisposeAsync(); await _providers.DisposeAsync();
await _episodes.DisposeAsync(); if (_episodes.IsValueCreated)
await _episodes.Value.DisposeAsync();
} }
public override Task<Season> Get(string slug) public override Task<Season> Get(string slug)
@ -161,7 +164,7 @@ namespace Kyoo.Controllers
await _database.SaveChangesAsync(); await _database.SaveChangesAsync();
if (obj.Episodes != null) if (obj.Episodes != null)
await _episodes.DeleteRange(obj.Episodes); await _episodes.Value.DeleteRange(obj.Episodes);
} }
} }
} }

View File

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using Kyoo.Models; using Kyoo.Models;
using Kyoo.Models.Exceptions; using Kyoo.Models.Exceptions;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
namespace Kyoo.Controllers namespace Kyoo.Controllers
{ {
@ -16,17 +17,16 @@ namespace Kyoo.Controllers
private readonly IPeopleRepository _people; private readonly IPeopleRepository _people;
private readonly IGenreRepository _genres; private readonly IGenreRepository _genres;
private readonly IProviderRepository _providers; private readonly IProviderRepository _providers;
private readonly ISeasonRepository _seasons; private readonly Lazy<ISeasonRepository> _seasons;
private readonly IEpisodeRepository _episodes; private readonly Lazy<IEpisodeRepository> _episodes;
protected override Expression<Func<Show, object>> DefaultSort => x => x.Title; protected override Expression<Func<Show, object>> DefaultSort => x => x.Title;
public ShowRepository(DatabaseContext database, public ShowRepository(DatabaseContext database,
IStudioRepository studios, IStudioRepository studios,
IPeopleRepository people, IPeopleRepository people,
IGenreRepository genres, IGenreRepository genres,
IProviderRepository providers, IProviderRepository providers,
ISeasonRepository seasons, IServiceProvider services)
IEpisodeRepository episodes)
: base(database) : base(database)
{ {
_database = database; _database = database;
@ -34,8 +34,8 @@ namespace Kyoo.Controllers
_people = people; _people = people;
_genres = genres; _genres = genres;
_providers = providers; _providers = providers;
_seasons = seasons; _seasons = new Lazy<ISeasonRepository>(services.GetRequiredService<ISeasonRepository>);
_episodes = episodes; _episodes = new Lazy<IEpisodeRepository>(services.GetRequiredService<IEpisodeRepository>);
} }
public override void Dispose() public override void Dispose()
@ -45,8 +45,10 @@ namespace Kyoo.Controllers
_people.Dispose(); _people.Dispose();
_genres.Dispose(); _genres.Dispose();
_providers.Dispose(); _providers.Dispose();
_seasons.Dispose(); if (_seasons.IsValueCreated)
_episodes.Dispose(); _seasons.Value.Dispose();
if (_episodes.IsValueCreated)
_episodes.Value.Dispose();
} }
public override async ValueTask DisposeAsync() public override async ValueTask DisposeAsync()
@ -56,8 +58,10 @@ namespace Kyoo.Controllers
await _people.DisposeAsync(); await _people.DisposeAsync();
await _genres.DisposeAsync(); await _genres.DisposeAsync();
await _providers.DisposeAsync(); await _providers.DisposeAsync();
await _seasons.DisposeAsync(); if (_seasons.IsValueCreated)
await _episodes.DisposeAsync(); await _seasons.Value.DisposeAsync();
if (_episodes.IsValueCreated)
await _episodes.Value.DisposeAsync();
} }
public override async Task<ICollection<Show>> Search(string query) public override async Task<ICollection<Show>> Search(string query)
@ -168,15 +172,14 @@ namespace Kyoo.Controllers
if (obj.LibraryLinks != null) if (obj.LibraryLinks != null)
foreach (LibraryLink entry in obj.LibraryLinks) foreach (LibraryLink entry in obj.LibraryLinks)
_database.Entry(entry).State = EntityState.Deleted; _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) if (obj.Seasons != null)
await _seasons.DeleteRange(obj.Seasons); await _seasons.Value.DeleteRange(obj.Seasons);
if (obj.Episodes != null) if (obj.Episodes != null)
await _episodes.DeleteRange(obj.Episodes); await _episodes.Value.DeleteRange(obj.Episodes);
} }
} }
} }

View File

@ -133,16 +133,16 @@ namespace Kyoo
}); });
services.AddTransient<ILibraryRepository, LibraryRepository>(); services.AddScoped<ILibraryRepository, LibraryRepository>();
services.AddTransient<ICollectionRepository, CollectionRepository>(); services.AddScoped<ICollectionRepository, CollectionRepository>();
services.AddTransient<IShowRepository, ShowRepository>(); services.AddScoped<IShowRepository, ShowRepository>();
services.AddTransient<ISeasonRepository, SeasonRepository>(); services.AddScoped<ISeasonRepository, SeasonRepository>();
services.AddTransient<IEpisodeRepository, EpisodeRepository>(); services.AddScoped<IEpisodeRepository, EpisodeRepository>();
services.AddTransient<ITrackRepository, TrackRepository>(); services.AddScoped<ITrackRepository, TrackRepository>();
services.AddTransient<IPeopleRepository, PeopleRepository>(); services.AddScoped<IPeopleRepository, PeopleRepository>();
services.AddTransient<IStudioRepository, StudioRepository>(); services.AddScoped<IStudioRepository, StudioRepository>();
services.AddTransient<IGenreRepository, GenreRepository>(); services.AddScoped<IGenreRepository, GenreRepository>();
services.AddTransient<IProviderRepository, ProviderRepository>(); services.AddScoped<IProviderRepository, ProviderRepository>();
services.AddScoped<ILibraryManager, LibraryManager>(); services.AddScoped<ILibraryManager, LibraryManager>();
services.AddSingleton<ITranscoder, Transcoder>(); services.AddSingleton<ITranscoder, Transcoder>();