Beispiel #1
0
        /// <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.");
            }
        }
Beispiel #2
0
        /// <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.");
            }
        }