예제 #1
0
        public override TImplementation Compose(IComponentComposer composer, bool throwOnUnknown,
                                                IConstructorSelector constructorSelector)
        {
            if (disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

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

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

            if (!this.lazyInstance.IsValueCreated)
            {
                this.Composer            = composer;
                this.ThrowOnUnknown      = throwOnUnknown;
                this.ConstructorSelector = constructorSelector;
            }

            return(this.lazyInstance.Value);
        }
예제 #2
0
        public override TImplementation Compose(IComponentComposer composer, bool throwOnUnknown,
                                                IConstructorSelector constructorSelector)
        {
            if (disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

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

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

            if (null == threadLocalInstance.Value)
            {
                threadLocalInstance.Value = (TImplementation)composer.ComposeUsingConstructor(typeof(TImplementation), throwOnUnknown, constructorSelector);
            }

            return(threadLocalInstance.Value);
        }
예제 #3
0
        // TODO: Add composition support using parameters that aren't in the container (Builder extension syntax).

        public T Compose <T>(bool throwOnUnknown         = true,
                             IComponentComposer composer = null,
                             IConstructorSelector constructorSelector = null)
        {
            if (this.disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            return((T)this.Compose(typeof(T), throwOnUnknown, composer, constructorSelector));
        }
예제 #4
0
        public override void PrepareComposition(IComponentComposer composer, IConstructorSelector constructorSelector)
        {
            if (null == composer)
            {
                throw new ArgumentNullException(nameof(composer));
            }

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

            composer.PrepareToComposeUsingConstructor(typeof(TImplementation), constructorSelector);
        }
예제 #5
0
        public object Compose(Type componentType,
                              bool throwOnUnknown         = true,
                              IComponentComposer composer = null,
                              IConstructorSelector constructorSelector = null)
        {
            if (this.disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

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

            var component = this.GetRegisteredComponent(componentType);

            switch (component)
            {
            case null when componentType.IsInterface && !throwOnUnknown:
                return(null);

            case null when componentType.IsInterface && throwOnUnknown:
                throw new ArgumentException($"Failed to compose '{componentType.FullName}', no matching component registration was found. Did you forget to register a component?", nameof(componentType));

            case null when componentType.IsAbstract && !throwOnUnknown:
                return(null);

            case null when componentType.IsAbstract && throwOnUnknown:
                throw new ArgumentException($"Failed to compose '{componentType.FullName}', no matching component registration was found and the requested type can not be constructed because it is abstract.", nameof(componentType));

            case null:
                return((composer ?? this.DefaultComposer).ComposeUsingConstructor(
                           componentType, throwOnUnknown, constructorSelector ?? this.DefaultConstructorSelector));
            }

            if (component.InstanceType.IsAbstract)
            {
                throw new ArgumentException($"Failed to compose '{componentType.FullName}', no matching component registration was found and the requested type can not be constructed because it is abstract. There may be a bug in your { nameof(IContainerComponent) }.", nameof(componentType));
            }

            return(component.Compose(composer ?? this.DefaultComposer, throwOnUnknown,
                                     constructorSelector ?? this.DefaultConstructorSelector));
        }
예제 #6
0
        public override TImplementation Compose(IComponentComposer composer, bool throwOnUnknown, IConstructorSelector constructorSelector)
        {
            if (this.disposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

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

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

            return(this.staticInstance);
        }
예제 #7
0
 object IContainerComponent.Compose(IComponentComposer composer,
                                    bool throwOnUnknown, IConstructorSelector constructorSelector)
 {
     return(this.Compose(composer, throwOnUnknown, constructorSelector));
 }
예제 #8
0
 public virtual void PrepareComposition(IComponentComposer composer, IConstructorSelector constructorSelector)
 {
     throw new NotImplementedException();
 }
예제 #9
0
 public abstract TComponent Compose(IComponentComposer composer, bool throwOnUnknown, IConstructorSelector constructorSelector);
예제 #10
0
        public ComponentContainer(bool prepareCompositionOnRegister = true, bool registerSelf = true, IComponentComposer defaultComposer = null, IConstructorSelector defaultConstructorSelector = null)
        {
            // NOTE: The settings in this constructor are getting pretty long, change it to a configuration class if more are added.
            this.PrepareCompositionOnRegister = prepareCompositionOnRegister;
            this.DefaultComposer            = defaultComposer ?? new ReflectionComponentComposer(this);
            this.DefaultConstructorSelector = defaultConstructorSelector ?? new LargestConstructorSelector();

            if (registerSelf)
            {
                this.Register <IComponentContainer>().To(this);
            }
        }