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); }
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); }
// 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)); }
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); }
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)); }
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); }
object IContainerComponent.Compose(IComponentComposer composer, bool throwOnUnknown, IConstructorSelector constructorSelector) { return(this.Compose(composer, throwOnUnknown, constructorSelector)); }
public virtual void PrepareComposition(IComponentComposer composer, IConstructorSelector constructorSelector) { throw new NotImplementedException(); }
public abstract TComponent Compose(IComponentComposer composer, bool throwOnUnknown, IConstructorSelector constructorSelector);
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); } }