Пример #1
0
        RegisterInstance <T>(this ContainerBuilder builder, T instance)
            where T : class
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            if (instance == null)
            {
                throw new ArgumentNullException(nameof(instance));
            }

            var activator = new ProvidedInstanceActivator(instance);

            var rb = new RegistrationBuilder <T, SimpleActivatorData, SingleRegistrationStyle>(
                new TypedService(typeof(T)),
                new SimpleActivatorData(activator),
                new SingleRegistrationStyle());

            rb.SingleInstance();

            rb.RegistrationData.DeferredCallback = builder.RegisterCallback(cr =>
            {
                if (!(rb.RegistrationData.Lifetime is RootScopeLifetime) ||
                    rb.RegistrationData.Sharing != InstanceSharing.Shared)
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, RegistrationExtensionsResources.InstanceRegistrationsAreSingleInstanceOnly, instance));
                }

                activator.DisposeInstance = rb.RegistrationData.Ownership == InstanceOwnership.OwnedByLifetimeScope;

                // https://github.com/autofac/Autofac/issues/1102
                // Single instance registrations with any custom activation phases (i.e. activation handlers) need to be auto-activated,
                // so that other behaviour (such as OnRelease) that expects 'normal' object lifetime behaviour works as expected.
                if (rb.ResolvePipeline.Middleware.Any(s => s.Phase == PipelinePhase.Activation))
                {
                    var autoStartService = rb.RegistrationData.Services.First();

                    var activationRegistration = new RegistrationBuilder <T, SimpleActivatorData, SingleRegistrationStyle>(
                        new AutoActivateService(),
                        new SimpleActivatorData(new DelegateActivator(typeof(T), (c, p) => c.ResolveService(autoStartService))),
                        new SingleRegistrationStyle());

                    RegistrationBuilder.RegisterSingleComponent(cr, activationRegistration);
                }

                RegistrationBuilder.RegisterSingleComponent(cr, rb);
            });

            return(rb);
        }
        public static IRegistrationBuilder <T, SimpleActivatorData, SingleRegistrationStyle> RegisterInstance <T>(this ContainerBuilder builder, T instance) where T : class
        {
            if (builder == null)
            {
                throw new ArgumentNullException("builder");
            }
            if (instance == null)
            {
                throw new ArgumentNullException("instance");
            }
            ProvidedInstanceActivator activator = new ProvidedInstanceActivator(instance);
            RegistrationBuilder <T, SimpleActivatorData, SingleRegistrationStyle> rb = new RegistrationBuilder <T, SimpleActivatorData, SingleRegistrationStyle>(new TypedService(typeof(T)), new SimpleActivatorData(activator), new SingleRegistrationStyle());

            rb.SingleInstance();
            builder.RegisterCallback(delegate(IComponentRegistry cr) {
                if (!(rb.RegistrationData.Lifetime is RootScopeLifetime) || (rb.RegistrationData.Sharing != InstanceSharing.Shared))
                {
                    throw new InvalidOperationException(string.Format(RegistrationExtensionsResources.InstanceRegistrationsAreSingleInstanceOnly, instance));
                }
                activator.DisposeInstance = rb.RegistrationData.Ownership == InstanceOwnership.OwnedByLifetimeScope;
                RegistrationBuilder.RegisterSingleComponent <T, SimpleActivatorData, SingleRegistrationStyle>(cr, rb);
            });
            return(rb);
        }