using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; using Oqtane.Infrastructure; using Oqtane.Models; namespace Oqtane.Repository { public class SiteTemplateRepository : ISiteTemplateRepository { private readonly IServiceProvider _serviceProvider; public SiteTemplateRepository(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } private List LoadSiteTemplates() { List siteTemplates = new List(); // iterate through Oqtane site template assemblies Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies() .Where(item => item.FullName.StartsWith("Oqtane.") || item.FullName.Contains(".SiteTemplate.")).ToArray(); foreach (Assembly assembly in assemblies) { siteTemplates = LoadSiteTemplatesFromAssembly(siteTemplates, assembly); } return siteTemplates; } private List LoadSiteTemplatesFromAssembly(List siteTemplates, Assembly assembly) { SiteTemplate siteTemplate; Type[] siteTemplateTypes = assembly.GetTypes().Where(item => item.GetInterfaces().Contains(typeof(ISiteTemplate))).ToArray(); foreach (Type siteTemplateType in siteTemplateTypes) { var siteTemplateObject = ActivatorUtilities.CreateInstance(_serviceProvider, siteTemplateType); siteTemplate = new SiteTemplate { Name = (string)siteTemplateType.GetProperty("Name")?.GetValue(siteTemplateObject), TypeName = siteTemplateType.AssemblyQualifiedName }; siteTemplates.Add(siteTemplate); } return siteTemplates; } public IEnumerable GetSiteTemplates() { return LoadSiteTemplates(); } } }