Exemple #1
0
        static public ContainerBuilder AddAutofaqDiagnostics(this ContainerBuilder autofaqBuilder)
        {
            if (!EnableDiagnostics)
            {
                return(autofaqBuilder);
            }

            var tracer = new DefaultDiagnosticTracer(); //0

            tracer.OperationCompleted += (_, args) => { Console.WriteLine(args.TraceContent); };

            autofaqBuilder.RegisterBuildCallback(lifetimeScope =>
            {
                var container = (IContainer)lifetimeScope;

                container.SubscribeToDiagnostics(tracer);
            });

            return(autofaqBuilder);

            //0 Add any Autofac modules or registrations  This is called AFTER ConfigureServices so things we
            //  register here OVERRIDE things registered in ConfigureServices
            //
            //  We must have the call to UseServiceProviderFactory(new AutofacServiceProviderFactory())
            //  when building the host or this wont be called
            //
            //  Diagnostics get printed via a build callback   Diagnostics arent free so we shouldnt just do this
            //  by default
            //
            //  Note  since we are diagnosing the container we cant ALSO resolve the logger to which the diagnostics
            //  get written so writing directly to the log destination is the way to go
        }
        public void DiagnosticTracerHandlesDecorators()
        {
            var tracer = new DefaultDiagnosticTracer();

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterType <Implementor>().As <IService>();
            containerBuilder.RegisterDecorator <Decorator, IService>();

            var container = containerBuilder.Build();

            container.SubscribeToDiagnostics(tracer);

            string lastOpResult = null;

            tracer.OperationCompleted += (sender, args) =>
            {
                Assert.Same(tracer, sender);
                lastOpResult = args.TraceContent;
            };

            container.Resolve <IService>();

            Assert.Contains("Decorator", lastOpResult);
        }
        public void TypeAsInstancePerScope()
        {
            var builder = new ContainerBuilder();

            builder.RegisterType <A>().InstancePerLifetimeScope();

            var container = builder.Build();

            var lifetime = container.BeginLifetimeScope();

            var tracer = new DefaultDiagnosticTracer();

            tracer.OperationCompleted += (sender, args) =>
            {
                _output.WriteLine(args.TraceContent);
            };

            container.SubscribeToDiagnostics(tracer);

            var ctxA  = lifetime.Resolve <A>();
            var ctxA2 = lifetime.Resolve <A>();

            Assert.Same(ctxA, ctxA2);

            var targetA  = container.Resolve <A>();
            var targetA2 = container.Resolve <A>();

            Assert.Same(targetA, targetA2);
            Assert.NotSame(ctxA, targetA);
        }
        public void DiagnosticTracerRaisesEventsOnError()
        {
            var tracer = new DefaultDiagnosticTracer();

            var containerBuilder = new ContainerBuilder();

            containerBuilder.Register <string>(ctxt => throw new InvalidOperationException());

            var container = containerBuilder.Build();

            container.SubscribeToDiagnostics(tracer);

            string lastOpResult = null;

            tracer.OperationCompleted += (sender, args) =>
            {
                Assert.Same(tracer, sender);
                lastOpResult = args.TraceContent;
                Assert.False(args.OperationSucceeded);
            };

            try
            {
                container.Resolve <string>();
            }
            catch
            {
            }

            Assert.Contains(nameof(InvalidOperationException), lastOpResult);
        }
        public void DiagnosticTracerRaisesEvents()
        {
            var tracer = new DefaultDiagnosticTracer();

            var containerBuilder = new ContainerBuilder();

            containerBuilder.Register(ctxt => "Hello");

            var container = containerBuilder.Build();

            container.SubscribeToDiagnostics(tracer);

            string lastOpResult = null;

            tracer.OperationCompleted += (sender, args) =>
            {
                Assert.Same(tracer, sender);
                lastOpResult = args.TraceContent;
                Assert.True(args.OperationSucceeded);
            };

            container.Resolve <string>();

            Assert.Contains("Hello", lastOpResult);
        }
Exemple #6
0
        public void DecoratedInstancePerDependencyRegistrationCanIncludeOtherServices()
        {
            var builder = new ContainerBuilder();

            builder.RegisterGeneric(typeof(ImplementorA <>)).As(typeof(IDecoratedService <>)).As(typeof(IService <>));
            builder.RegisterGenericDecorator(typeof(DecoratorA <>), typeof(IDecoratedService <>));
            builder.RegisterGenericDecorator(typeof(DecoratorA <>), typeof(IService <>));
            var container = builder.Build();

            var tracer = new DefaultDiagnosticTracer();

            container.SubscribeToDiagnostics(tracer);

            tracer.OperationCompleted += (sender, args) =>
            {
                _outputHelper.WriteLine(args.TraceContent);
            };

            var serviceRegistration          = container.RegistrationFor <IService <int> >();
            var decoratedServiceRegistration = container.RegistrationFor <IDecoratedService <int> >();

            Assert.NotNull(serviceRegistration);
            Assert.NotNull(decoratedServiceRegistration);
            Assert.Same(serviceRegistration, decoratedServiceRegistration);

            var serviceInstance = container.Resolve <IService <int> >();

            Assert.IsType <DecoratorA <int> >(serviceInstance);

            var decoratedServiceInstance = container.Resolve <IDecoratedService <int> >();

            Assert.IsType <DecoratorA <int> >(decoratedServiceInstance);

            Assert.NotSame(serviceInstance, decoratedServiceInstance);
        }
        public void ConfigureContainer(ContainerBuilder builder)
        {
            var resolveOperationTracer = new DefaultDiagnosticTracer();

            resolveOperationTracer.OperationCompleted += (sender, args) =>
            {
                // HERE
                // this will try to resolve IHttpContextAccessor
                LogManager.GetLogger(nameof(DefaultDiagnosticTracer)).Info(args.TraceContent);
            };

            builder.RegisterBuildCallback(c =>
            {
                var container = c as IContainer;
                container.SubscribeToDiagnostics(resolveOperationTracer);
            });
        }
        public void DiagnosticTracerDoesNotLeakMemory()
        {
            var tracer = new DefaultDiagnosticTracer();

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterType <Implementor>().As <IService>();
            containerBuilder.RegisterDecorator <Decorator, IService>();

            var container = containerBuilder.Build();

            container.SubscribeToDiagnostics(tracer);
            container.Resolve <IService>();

            // The dictionary of tracked operations and
            // string builders should be empty.
            Assert.Equal(0, tracer.OperationsInProgress);
        }
        public void InstancePerDependencyDoesNotAllowCircularDependencies_PropertyOwnerResolved_WithTracerAttached()
        {
            var cb = new ContainerBuilder();

            cb.RegisterType <DependsByCtor>();
            cb.RegisterType <DependsByProp>().PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

            var c = cb.Build();

            string capturedTrace = null;

            var tracer = new DefaultDiagnosticTracer();

            tracer.OperationCompleted += (sender, args) =>
            {
                capturedTrace = args.TraceContent;
                _output.WriteLine(capturedTrace);
            };
            c.SubscribeToDiagnostics(tracer);

            Assert.Throws <DependencyResolutionException>(() => c.Resolve <DependsByProp>());
            Assert.NotNull(capturedTrace);
        }
Exemple #10
0
        public void DecoratedInstancePerLifetimeScopeRegistrationCanIncludeOtherServices()
        {
            var builder = new ContainerBuilder();

            // #963: The InstancePerLifetimeScope here is important - a single component may expose multiple services.
            // If that component is decorated, the decorator ALSO needs to expose all of those services.
            builder.RegisterGeneric(typeof(ImplementorA <>)).As(typeof(IDecoratedService <>)).As(typeof(IService <>)).InstancePerLifetimeScope();
            builder.RegisterGenericDecorator(typeof(DecoratorA <>), typeof(IDecoratedService <>));
            var container = builder.Build();

            var tracer = new DefaultDiagnosticTracer();

            container.SubscribeToDiagnostics(tracer);

            tracer.OperationCompleted += (sender, args) =>
            {
                _outputHelper.WriteLine(args.TraceContent);
            };

            var serviceRegistration          = container.RegistrationFor <IService <int> >();
            var decoratedServiceRegistration = container.RegistrationFor <IDecoratedService <int> >();

            Assert.NotNull(serviceRegistration);
            Assert.NotNull(decoratedServiceRegistration);
            Assert.Same(serviceRegistration, decoratedServiceRegistration);

            var serviceInstance = container.Resolve <IService <int> >();

            Assert.IsType <ImplementorA <int> >(serviceInstance);

            var decoratedServiceInstance = container.Resolve <IDecoratedService <int> >();

            Assert.IsType <DecoratorA <int> >(decoratedServiceInstance);

            Assert.Same(serviceInstance, decoratedServiceInstance.Decorated);
        }