diff --git a/src/Tribufu.Database/DatabaseSeeder.cs b/src/Tribufu.Database/DatabaseSeeder.cs new file mode 100644 index 0000000..58f3f5d --- /dev/null +++ b/src/Tribufu.Database/DatabaseSeeder.cs @@ -0,0 +1,50 @@ +// Copyright (c) Tribufu. All Rights Reserved. +// SPDX-License-Identifier: MIT + +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Linq; +using System.Threading.Tasks; +using Tribufu.Database.Repositories; + +namespace Tribufu.Database +{ + public class DatabaseSeeder + { + private readonly IServiceProvider _provider; + + public DatabaseSeeder(IServiceProvider provider) + { + _provider = provider; + } + + public async Task SeedAsync() + { + var repoType = typeof(IRepository<,>); + + var repos = _provider + .GetServices() + .Where(s => + { + var type = s.GetType(); + return type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == repoType); + }) + .ToList(); + + foreach (var repo in repos) + { + var method = repo.GetType().GetMethod("SeedAsync"); + + if (method != null) + { + var task = method.Invoke(repo, null); + + if (task != null) + { + await (Task)task; + } + } + } + } + } +} diff --git a/src/Tribufu.Database/Repositories/IRepository.cs b/src/Tribufu.Database/Repositories/IRepository.cs index 34f9b3a..b11ed6c 100644 --- a/src/Tribufu.Database/Repositories/IRepository.cs +++ b/src/Tribufu.Database/Repositories/IRepository.cs @@ -6,13 +6,10 @@ using System.Threading.Tasks; namespace Tribufu.Database.Repositories { - public interface IRepository + public interface IRepository where T : class { - void SeedDefaults(); - } + Task SeedAsync(); - public interface IRepository : IRepository where T : class - { IList GetAll(); Task> GetAllAsync(); diff --git a/src/Tribufu.Database/Repositories/Repository.cs b/src/Tribufu.Database/Repositories/Repository.cs index 54e38f3..171e213 100644 --- a/src/Tribufu.Database/Repositories/Repository.cs +++ b/src/Tribufu.Database/Repositories/Repository.cs @@ -21,7 +21,7 @@ namespace Tribufu.Database.Repositories _dbSet = context.Set(); } - public virtual void SeedDefaults() + public virtual async Task SeedAsync() { } diff --git a/src/Tribufu.Database/Repositories/RepositorySeeder.cs b/src/Tribufu.Database/Repositories/RepositorySeeder.cs deleted file mode 100644 index 55f8ce2..0000000 --- a/src/Tribufu.Database/Repositories/RepositorySeeder.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Tribufu. All Rights Reserved. -// SPDX-License-Identifier: MIT - -using System.Collections.Generic; - -namespace Tribufu.Database.Repositories -{ - public class RepositorySeeder - { - private readonly IEnumerable _repositories; - - public RepositorySeeder(IEnumerable repositories) - { - _repositories = repositories; - } - - public void Run() - { - foreach (var repo in _repositories) - { - repo.SeedDefaults(); - } - } - } -}