private static void ApplySettings(ContainerHelperSettings s) { if (s != null) { DoInterception = s.DoInterception; DoTraceConditionalRegistration = s.DoTraceConditionalRegistration; } }
/// <summary>Setups the container.</summary> /// <param name="container">The container.</param> /// <param name="assembliesToScan">The assemblies to scan.</param> /// <param name="containerHelperSettings"></param> /// <returns></returns> /// <autogeneratedoc /> /// TODO Edit XML Comment Template for SetupContainer public static ILifetimeScope SetupContainer( out IContainer container , IEnumerable <Assembly> assembliesToScan , ContainerHelperSettings containerHelperSettings ) { if (assembliesToScan == null) { assembliesToScan = GetAssembliesForScanningViaTypes( ); } if (containerHelperSettings != null) { Logger.Info("Applying container helper settings from app.config"); ApplySettings(containerHelperSettings); } else { Logger.Debug("No containerHelperSettings to apply."); } AppLoggingConfigHelper.EnsureLoggingConfigured( ); #if ENABLE_BUILDERPROXY BuilderInterceptor builderInterceptor = null; if (DoProxyBuilder) { Logger.Info("Proxying container builder for debug purposes."); var proxyGenerator = ProxyGenerator; builderInterceptor = new BuilderInterceptor(proxyGenerator); var proxy = proxyGenerator.CreateClassProxy <ContainerBuilder> (builderInterceptor); builder = proxy; } else { builder = new ContainerBuilder( ); } #else var builder = new ContainerBuilder( ); #endif // Set the property in order to propagate the settings. builder.Properties[InterceptProperty] = DoInterception; var toScan = assembliesToScan as Assembly[] ?? assembliesToScan.ToArray( ); builder.Properties[AssembliesForScanningProperty] = GetAssembliesForScanning( ); #region Autofac Modules builder.RegisterModule <AttributedMetadataModule> ( ); builder.RegisterModule <IdGeneratorModule> ( ); #if MENUS_ENABLE builder.RegisterModule < > ( ); #endif #endregion var i = 0; void LogStuff(ref int index) { #if ENABLE_BUILDERPROXY builderInterceptor?.Invocations.ForEach( invocation => Logger.Debug( $"{index}]: {invocation.Method.Name} ({string.Join ( ", " , invocation.Arguments )}) => {invocation.OriginalReturnValue}" ) ); #endif index++; } LogStuff(ref i); #region Assembly scanning builder.RegisterAssemblyTypes(toScan) .Where(MainScanningPredicate) .AsImplementedInterfaces( ); builder.RegisterAssemblyTypes(toScan.ToArray( )) .Where( delegate(Type t) { var isAssignableFrom = typeof(Window).IsAssignableFrom(t); TraceConditionalRegistration( t , typeof(Window) , isAssignableFrom ); return(isAssignableFrom); } ) .AsSelf( ) .As <Window> ( ) .OnActivating( args => { var argsInstance = args.Instance; if (argsInstance is IHaveLogger haveLogger) { haveLogger.Logger = args.Context.Resolve <ILogger> ( new TypedParameter( typeof (Type ) , argsInstance .GetType( ) ) ); } } ); #endregion #region Interceptors if (DoInterception) { builder.RegisterType <LoggingInterceptor> ( ).AsSelf( ); } #endregion #region Logging builder.RegisterType <LoggerTracker> ( ) .As <ILoggerTracker> ( ) .InstancePerLifetimeScope( ); // builder.RegisterType < LogFactory > ( ).AsSelf ( ) ; builder.Register( (c, p) => { var loggerName = "unset"; try { loggerName = p.TypedAs <Type> ( ).FullName; } catch (Exception ex) { Console.WriteLine(ex.ToString( )); } var tracker = c.Resolve <ILoggerTracker> ( ); Logger.Trace($"creating logger loggerName = {loggerName}"); var logger = LogManager.GetLogger(loggerName); tracker.TrackLogger(loggerName, logger); return(logger); } ) .As <ILogger> ( ); #endregion #region Callbacks builder.RegisterBuildCallback(c => Logger.Info("Container built.")); builder.RegisterCallback( registry => { registry.Registered += (sender, args) => { Logger.Trace( "Registered " + args.ComponentRegistration.Activator .LimitType ); args.ComponentRegistration.Activated += ( o , eventArgs ) => { Logger.Trace( $"Activated {DescribeComponent ( eventArgs.Component )} (sender={o}, instance={eventArgs.Instance})" ); }; }; } ); #endregion #region Container Build var setupContainer = builder.Build( ); container = setupContainer; setupContainer.ChildLifetimeScopeBeginning += SetupContainerOnChildLifetimeScopeBeginning; #endregion setupContainer.CurrentScopeEnding += SetupContainerOnCurrentScopeEnding; setupContainer.ResolveOperationBeginning += SetupContainerOnResolveOperationBeginning; var beginLifetimeScope = setupContainer.BeginLifetimeScope("initial scope"); return(beginLifetimeScope); }