using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNet.Builder; using Microsoft.Extensions.Logging; namespace Yavsc { using Exceptions; using Models; public partial class Startup { /// /// Lists Available user profile classes, /// populated at startup, using reflexion. /// public static List ProfileTypes = new List() ; public static List UserSettings = new List (); /// /// Lists available command forms. /// This is hard coded. /// public static readonly string [] Forms = new string [] { "Profiles" , "HairCut" }; public static PropertyInfo GetUserSettingPropertyInfo(string settingsClassName) { return UserSettings.SingleOrDefault(s => s.PropertyType.GenericTypeArguments[0].FullName == settingsClassName ) ; } private void ConfigureWorkflow(IApplicationBuilder app, SiteSettings settings, ILogger logger) { System.AppDomain.CurrentDomain.ResourceResolve += OnYavscResourceResolve; foreach (var a in System.AppDomain.CurrentDomain.GetAssemblies()) { foreach (var c in a.GetTypes()) { if (c.IsClass && !c.IsAbstract && c.GetInterface("ISpecializationSettings")!=null) { ProfileTypes.Add(c); } } } foreach (var propinfo in typeof(ApplicationDbContext).GetProperties()) { foreach (var attr in propinfo.CustomAttributes) { if (attr.AttributeType == typeof(Yavsc.Attributes.ActivitySettingsAttribute)) { // bingo if (typeof(IQueryable).IsAssignableFrom(propinfo.PropertyType)) { logger.LogVerbose($"Paramêtres utilisateur déclaré: {propinfo.Name}"); UserSettings.Add(propinfo); } else // Design time error { var msg = $@"La propriété {propinfo.Name} du contexte de la base de donnée porte l'attribut [ActivitySetting], mais n'implemente pas l'interface IQueryable ({propinfo.MemberType.GetType()})"; logger.LogCritical(msg); throw new InvalidWorkflowModelException(msg); } } } } } public static System.Reflection.Assembly OnYavscResourceResolve (object sender, ResolveEventArgs ev) { return AppDomain.CurrentDomain.GetAssemblies()[0]; } } }