/// <summary> /// Registers the by I service registration. /// </summary> /// <param name="registrar">The registrar.</param> /// <param name="predicate">The predicate.</param> /// <param name="assemblies">The assemblies.</param> public static void RegisterByIServiceRegistration(this IServiceRegistrar registrar, Predicate <Type> predicate, params Assembly[] assemblies) { if (registrar == null) { throw new ArgumentNullException("registrar"); } var debugger = ServiceLocatorManager.Debugger; if (debugger == null || (debugger.Flags & ServiceLocatorManagerDebugger.DebuggerFlags.ByIServiceRegistration) != ServiceLocatorManagerDebugger.DebuggerFlags.ByIServiceRegistration) { if (assemblies == null || assemblies.Count() == 0) { return; } var locator = registrar.Locator; var registrationType = typeof(IServiceRegistrant); var matchedTypes = assemblies.SelectMany(a => a.AsConcreteTypes(registrationType, predicate)) .Where(t => !ServiceLocatorManager.HasIgnoreServiceLocator(t)); foreach (var matchedType in matchedTypes) { locator.Resolve <IServiceRegistrant>(matchedType).Register(registrar); } } else { var log = debugger.Log; log.Information("RegisterByIServiceRegistration"); if (assemblies == null || assemblies.Count() == 0) { log.Information("Done. No assemblies requested."); return; } var locator = registrar.Locator; var registrationType = typeof(IServiceRegistrant); var matchedTypes = assemblies.SelectMany(a => { log.InformationFormat("- Scanning assembly {0}:", a.FullName); return(a.AsConcreteTypes(registrationType, predicate)); }) .Where(t => { if (!ServiceLocatorManager.HasIgnoreServiceLocator(t)) { return(true); } log.InformationFormat("- {0} HasIgnoreServiceLocator and has been skipped.", t.FullName); return(false); }); foreach (var matchedType in matchedTypes) { log.InformationFormat("- {0} Matching Type.", matchedType.FullName); locator.Resolve <IServiceRegistrant>(matchedType).Register(registrar); } log.Information("Done."); } }
/// <summary> /// Registers the by naming convention. /// </summary> /// <param name="action">The action.</param> /// <param name="predicate">The predicate.</param> /// <param name="assemblies">The assemblies.</param> public static void RegisterByNamingConvention(Action <Type, Type> action, Predicate <Type> predicate, IEnumerable <Assembly> assemblies) { if (action == null) { throw new ArgumentNullException("action"); } var debugger = ServiceLocatorManager.Debugger; if (debugger == null || (debugger.Flags & ServiceLocatorManagerDebugger.DebuggerFlags.ByNamingConvention) != ServiceLocatorManagerDebugger.DebuggerFlags.ByNamingConvention) { if (assemblies == null || assemblies.Count() == 0) { return; } var interfaceTypes = assemblies.SelectMany(a => a.AsTypes(t => t.IsInterface && t.Name.StartsWith("I") && (predicate == null || predicate(t)))); foreach (var interfaceType in interfaceTypes) { var concreteName = interfaceType.Name.Substring(1); var matchedTypes = interfaceType.Assembly.AsConcreteTypes(interfaceType, predicate) .Where(t => t.Name == concreteName && !ServiceLocatorManager.HasIgnoreServiceLocator(t)) .ToList(); if (matchedTypes.Count == 1) { action(interfaceType, matchedTypes.First()); } } } else { var log = debugger.Log; log.Information("RegisterByNamingConvention"); if (assemblies == null || assemblies.Count() == 0) { log.Information("Done. No assemblies requested."); return; } var interfaceTypes = assemblies.SelectMany(a => { log.InformationFormat("- Scanning assembly {0}:", a.FullName); return(a.AsTypes(t => t.IsInterface && t.Name.StartsWith("I") && (predicate == null || predicate(t)))); }); foreach (var interfaceType in interfaceTypes) { var concreteName = interfaceType.Name.Substring(1); var matchedTypes = interfaceType.Assembly.AsConcreteTypes(interfaceType, predicate) .Where(t => { if (t.Name == concreteName) { if (!ServiceLocatorManager.HasIgnoreServiceLocator(t)) { return(true); } log.InformationFormat("- {0} HasIgnoreServiceLocator and has been skipped.", t.FullName); return(false); } return(true); }) .ToList(); if (matchedTypes.Count == 1) { log.InformationFormat("- {0} matches {1}.", interfaceType.FullName, matchedTypes.First()); action(interfaceType, matchedTypes.First()); } else { log.InformationFormat("- {0} Matched {1} types and has been skipped.", interfaceType.FullName, matchedTypes.Count); } } log.Information("Done."); } }