yavsc/Yavsc/Startup/Startup.Workflow.cs

75 lines
3 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
2017-03-05 13:48:11 +01:00
using System.Linq;
using System.Reflection;
using Microsoft.AspNet.Builder;
2017-03-05 13:48:11 +01:00
using Microsoft.Extensions.Logging;
2017-03-05 16:32:30 +01:00
using Yavsc.Exceptions;
2017-03-05 13:48:11 +01:00
using Yavsc.Models;
using YavscLib;
namespace Yavsc
{
public partial class Startup
{
/// <summary>
2017-02-27 19:28:32 +01:00
/// Lists Available user profile classes,
/// populated at startup, using reflexion.
/// </summary>
2017-03-05 13:48:11 +01:00
public static List<Type> ProfileTypes = new List<Type>() ;
public static List<PropertyInfo> UserSettings = new List<PropertyInfo> ();
2017-02-27 19:28:32 +01:00
/// <summary>
/// Lists available command forms.
/// This is hard coded.
/// </summary>
public static readonly string [] Forms = new string [] { "Profiles" , "HairCut" };
2017-02-12 23:53:53 +01:00
2017-03-06 01:28:53 +01:00
public static PropertyInfo GetUserSettingPropertyInfo(string settingsClassName)
{
return UserSettings.SingleOrDefault(s => s.PropertyType.GenericTypeArguments[0].FullName == settingsClassName ) ;
}
2017-03-05 13:48:11 +01:00
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) {
2017-03-05 13:48:11 +01:00
ProfileTypes.Add(c);
}
}
}
2017-03-05 13:48:11 +01:00
foreach (var propinfo in typeof(ApplicationDbContext).GetProperties()) {
foreach (var attr in propinfo.CustomAttributes) {
2017-03-05 16:32:30 +01:00
if (attr.AttributeType == typeof(Yavsc.Attributes.ActivitySettingsAttribute)) {
2017-03-05 13:48:11 +01:00
// bingo
if (typeof(IQueryable<ISpecializationSettings>).IsAssignableFrom(propinfo.PropertyType))
{
logger.LogInformation($"Paramêtres utilisateur déclaré: {propinfo.Name}");
UserSettings.Add(propinfo);
} else
// Design time error
{
2017-03-05 16:32:30 +01:00
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<ISpecializationSettings>
({propinfo.MemberType.GetType()})";
logger.LogCritical(msg);
throw new InvalidWorkflowModelException(msg);
2017-03-05 13:48:11 +01:00
}
}
}
}
}
public static System.Reflection.Assembly OnYavscResourceResolve (object sender, ResolveEventArgs ev)
{
return AppDomain.CurrentDomain.GetAssemblies()[0];
}
}
}