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.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<IEpisodeRepository> _episodes;
private readonly IShowRepository _shows;
protected override Expression<Func<Season, object>> 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<IEpisodeRepository>(services.GetRequiredService<IEpisodeRepository>);
_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<Season> 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);
}
}
}

View File

@ -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,8 +17,8 @@ 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<ISeasonRepository> _seasons;
private readonly Lazy<IEpisodeRepository> _episodes;
protected override Expression<Func<Show, object>> DefaultSort => x => x.Title;
public ShowRepository(DatabaseContext database,
@ -25,8 +26,7 @@ namespace Kyoo.Controllers
IPeopleRepository people,
IGenreRepository genres,
IProviderRepository providers,
ISeasonRepository seasons,
IEpisodeRepository episodes)
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<ISeasonRepository>(services.GetRequiredService<ISeasonRepository>);
_episodes = new Lazy<IEpisodeRepository>(services.GetRequiredService<IEpisodeRepository>);
}
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<ICollection<Show>> Search(string query)
@ -171,12 +175,11 @@ namespace Kyoo.Controllers
await _database.SaveChangesAsync();
// TODO fix circular references of Show/Season/Episode Repository.
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);
}
}
}

View File

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