Ejemplo n.º 1
0
        private void RegisterDecoratorCore(
            Type serviceType,
            Type decoratorType,
            Predicate <DecoratorPredicateContext>?predicate = null,
            Lifestyle?lifestyle = null)
        {
            Requires.IsNotNull(serviceType, nameof(serviceType));
            Requires.IsNotNull(decoratorType, nameof(decoratorType));

            Requires.IsNotPartiallyClosed(serviceType, nameof(serviceType));
            Requires.ServiceTypeIsNotClosedWhenImplementationIsOpen(serviceType, decoratorType);
            Requires.ServiceOrItsGenericTypeDefinitionIsAssignableFromImplementation(
                serviceType, decoratorType, nameof(serviceType));

            Requires.ImplementationHasSelectableConstructor(this, decoratorType, nameof(decoratorType));
            Requires.IsDecorator(this, serviceType, decoratorType, nameof(decoratorType));
            Requires.DecoratorIsNotAnOpenGenericTypeDefinitionWhenTheServiceTypeIsNot(
                serviceType, decoratorType, nameof(decoratorType));

            Requires.OpenGenericTypeDoesNotContainUnresolvableTypeArguments(
                serviceType, decoratorType, nameof(decoratorType));

            var interceptor = new DecoratorInterceptor(
                new DecoratorExpressionInterceptorData(
                    this, serviceType, decoratorType, predicate, lifestyle ?? this.SelectionBasedLifestyle));

            this.ExpressionBuilt += interceptor.ExpressionBuilt;
        }