Beispiel #1
0
        public void WhenInitializedWithInstance_ThatInstanceIsReturnedFromActivateInstance()
        {
            object instance = new object();

            ProvidedInstanceActivator target = new ProvidedInstanceActivator(instance);

            var actual = target.ActivateInstance(Factory.EmptyContainer, Factory.NoParameters);

            Assert.AreSame(instance, actual);
        }
        public void ActivatingAProvidedInstanceTwice_RaisesException()
        {
            object instance = new object();

            ProvidedInstanceActivator target =
                new ProvidedInstanceActivator(instance);

            target.ActivateInstance(Factory.EmptyContainer, Factory.NoParameters);

            Assert.Throws <InvalidOperationException>(() =>
                                                      target.ActivateInstance(Factory.EmptyContainer, Factory.NoParameters));
        }
Beispiel #3
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);
        }
Beispiel #4
0
        public void WhenInitializedWithInstance_ThatInstanceIsReturnedFromActivateInstance()
        {
            object instance = new object();

            ProvidedInstanceActivator target = new ProvidedInstanceActivator(instance);

            var container = Factory.CreateEmptyContainer();

            var invoker = target.GetPipelineInvoker(container.ComponentRegistry);

            var actual = invoker(container, Factory.NoParameters);

            Assert.Same(instance, actual);
        }
Beispiel #5
0
        public void ActivatingAProvidedInstanceTwice_RaisesException()
        {
            object instance = new object();

            ProvidedInstanceActivator target =
                new ProvidedInstanceActivator(instance);

            var container = Factory.CreateEmptyContainer();

            var invoker = target.GetPipelineInvoker(container.ComponentRegistry);

            invoker(container, Factory.NoParameters);

            Assert.Throws <InvalidOperationException>(() =>
                                                      invoker(container, Factory.NoParameters));
        }
        public static IRegistrationBuilder <object, SimpleActivatorData, SingleRegistrationStyle> RegisterInstance(IComponentRegistry cr, Type returnType, object instance, string key)
        {
            if (instance == null)
            {
                throw new ArgumentNullException(nameof(instance));
            }

            var activator    = new ProvidedInstanceActivator(instance);
            var instanceType = instance.GetType();
            var rb           = RegistrationBuilder.ForDelegate(instanceType, ((context, parameters) => instance));

            if (returnType != instanceType)
            {
                if (!string.IsNullOrEmpty(key))
                {
                    rb.Keyed(key, returnType).Named("`1System.Collections.Generic.IEnumerable`1" + returnType.FullName, returnType);
                }
                else
                {
                    rb.As(returnType).Named("`1System.Collections.Generic.IEnumerable`1" + returnType.FullName, returnType);
                }
            }
            else
            {
                if (!string.IsNullOrEmpty(key))
                {
                    rb.Keyed(key, instanceType).Named("`1System.Collections.Generic.IEnumerable`1" + instanceType.FullName, instanceType);
                }
                else
                {
                    rb.As(instanceType).Named("`1System.Collections.Generic.IEnumerable`1" + instanceType.FullName, instanceType);
                }
            }

            rb.SingleInstance();
            if (!(rb.RegistrationData.Lifetime is RootScopeLifetime) ||
                rb.RegistrationData.Sharing != InstanceSharing.Shared)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "The instance  registration `{0}` can support SingleInstance() sharing only", instance));
            }

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

            RegistrationBuilder.RegisterSingleComponent(cr, rb);

            return(rb);
        }
Beispiel #7
0
        /// <summary>
        /// Installs a proxy factory.
        /// </summary>
        /// <typeparam name="T">The type of the proxy factory.</typeparam>
        /// <returns>
        /// A container with an installed proxy factory.
        /// </returns>
        public override Caliburn.Core.InversionOfControl.IContainer WithProxyFactory <T>()
        {
            Register(new[] { new Singleton {
                                 Service = typeof(IProxyFactory), Implementation = typeof(T)
                             } });

            var factory = this.GetInstance <IProxyFactory>();

            Container.ComponentRegistry.Registered += (s, e) =>
            {
                var implementation = e.ComponentRegistration.Activator.LimitType;

                if (!implementation.ShouldCreateProxy())
                {
                    return;
                }

                e.ComponentRegistration.Preparing += (sender, args) =>
                {
                    var registration = args.Component as ComponentRegistration;

                    if (registration != null)
                    {
                        var instance = factory.CreateProxy(implementation,
                                                           implementation.GetAttributes <IBehavior>(true).ToArray(),
                                                           DetermineConstructorArgs(implementation));

                        var activator = new ProvidedInstanceActivator(instance);

                        registration.Activator = activator;
                    }
                };
            };

            return(this);
        }
        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);
        }