private void CreateRepositories(BankScrapperDbContext dbContext) { if (dbContext == null) { throw new ArgumentNullException(nameof(dbContext)); } var baseRepositoryType = typeof(BaseDbRepository <>); var repositoryTypes = baseRepositoryType.Assembly .GetTypes() .Where(t => t.IsClass && !t.IsAbstract && t.BaseType.Name == baseRepositoryType.Name) .ToArray(); var dbContextProperties = dbContext.GetType().GetProperties(); var baseInterfaceName = typeof(IRepository <>).Name; foreach (var property in GetType().GetProperties()) { var baseInterface = property.PropertyType.GetInterface(baseInterfaceName); if (baseInterface == null) { throw new NotImplementedException($"Repositório \"{property.PropertyType.Name}\" não implementa a interface IRepository"); } var entityType = baseInterface.GetGenericArguments().FirstOrDefault(); var dbSetType = typeof(DbSet <>).MakeGenericType(entityType); var dbSetProperty = dbContextProperties.FirstOrDefault(p => p.PropertyType == dbSetType); if (dbSetProperty == null) { throw new NotImplementedException($"Coleção da entidade \"{entityType.Name}\" não foi implementado"); } var genericRepositoryType = baseRepositoryType.MakeGenericType(entityType); var repositoryType = repositoryTypes.FirstOrDefault(t => genericRepositoryType.IsAssignableFrom(t)); if (repositoryType == null) { throw new NotImplementedException($"Repositório da entidade \"{entityType.Name}\" não foi implementado"); } var dbSet = dbSetProperty.GetValue(dbContext); var repository = Activator.CreateInstance(repositoryType, new object[] { dbContext, dbSet }); property.SetValue(this, repository); } }
public BankScrapperContext(BankScrapperDbContext dbContext) { CreateRepositories(dbContext); }