Пример #1
0
 private static void ApplySettings(ContainerHelperSettings s)
 {
     if (s != null)
     {
         DoInterception = s.DoInterception;
         DoTraceConditionalRegistration = s.DoTraceConditionalRegistration;
     }
 }
Пример #2
0
        /// <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);
        }