import { ClassProviderConfig, FactoryProviderConfig, Token } from '@awesome-nodes/injection-factory';
import { ObjectBase } from '@awesome-nodes/object';
import { ServiceBase } from "../services";
import { ConstructorFunction } from 'simplytyped';
/**
 * Configures the factory provider to return the service factory configuration.
 */
export interface IServiceProvider {
    /**
     * An injection token. (Typically an instance of `Type` or `InjectionToken`, but can be `any`).
     */
    provide?: ConstructorFunction<object>;
    /**
     * A list of `token`s which need to be resolved by the injector. The list of values is then
     * used as arguments to the `useFactory` function.
     */
    deps?: Array<Token>;
}
/**
 * Represents the base object for the provider in the service provider pattern.
 */
export declare abstract class ServiceProviderBase<T extends ServiceBase<unknown>> extends ObjectBase {
    abstract get designFactory(): IServiceProvider;
    abstract get developmentFactory(): IServiceProvider;
    abstract get productionFactory(): IServiceProvider;
    provide(provide: ConstructorFunction<T>): T;
    abstract inject(provider: FactoryProviderConfig<T>): T;
    /**
     * Returns the factory configuration provided by a derived provider type on which this function was invoked on.
     * @param provide
     * @param provider
     */
    static createFactoryProvider<U extends ServiceBase<unknown>>(provide: ConstructorFunction<U>, provider?: ServiceProviderBase<U>): FactoryProviderConfig<U>;
    /**
     * Returns the staging configuration provided by the type on which this function was invoked on.
     */
    static createClassProvider<U extends ServiceBase<unknown>>(): ClassProviderConfig<U>;
}
