import { RequestDispatcher } from "./dispatcher/requestDispatcher";
import { ServiceDescription } from "./description/serviceDescription";
/**
 * The DispatcherFactory is the primary class used to configure the service model, and is responsible for creating the
 * [[RequestDispatcher]] based on the service descriptions.
 *
 * <uml>
 * hide members
 * hide circle
 * DispatcherFactory *-- ServiceDescription : services
 * DispatcherFactory .> RequestDispatcher
 * </uml>
 *
 * ### Example
 *
 * Once our service is defined, we add it to a DispatcherFactory. We then add an endpoint to the service,
 * providing the name of the contract, the base address for the endpoint, and a list of endpoint behaviors.
 *
 * ```typescript
 * import { DispatcherFactory, RpcBehavior } from "service-model";
 *
 * var factory = new DispatcherFactory();
 *
 * factory.addService(CalculatorService)
 *             .addEndpoint("Calculator", "/api/calculator", [new RpcBehavior()]);
 * ```
 *
 * In this case, we add the [[RpcBehavior]] which indicates that operations on this endpoint will be available
 * through RPC.
 */
export declare class DispatcherFactory {
    /**
     * List of service descriptions configured for the dispatcher factory.
     */
    services: ServiceDescription[];
    /**
     * @hidden
     */
    private _context;
    /**
     * Adds a service.
     * @param ctr The constructor for the service.
     * @param name The name of the service. If not specified the name of the constructor is used.
     */
    addService(ctr: Constructor<any>, name?: string): ServiceDescription;
    /**
     * Creates a request dispatcher used for dispatching service requests.
     */
    createDispatcher(): RequestDispatcher;
    /**
     * Creates a dispatch service based on the service description.
     * @param dispatcher The dispatcher.
     * @param service The service description.
     * @hidden
     */
    private _createDispatchService(dispatcher, service);
    /**
     * Creates a dispatch endpoint based on an endpoint description.
     * @param service The dispatch service.
     * @param endpoint The endpoint description.
     * @hidden
     */
    private _createDispatchEndpoint(service, endpoint);
    /**
     * Creates a dispatch operation based on an operation description.
     * @param endpoint The dispatch endpoint.
     * @param operation The operation description
     * @hidden
     */
    private _createDispatchOperation(endpoint, operation);
    /**
     * Applies all behaviors from the description objects to the dispatch objects.
     * @param service The dispatch service.
     * @param description The service description.
     * @hidden
     */
    private _applyServiceBehaviors(service, description);
    /**
     * Applies endpoint behaviors to the dispatch endpoint.
     * @param endpoint The dispatch endpoint.
     * @param description The endpoint description.
     * @hidden
     */
    private _applyEndpointBehaviors(endpoint, description);
    /**
     * Applies contract behaviors to the dispatch endpoint.
     * @param endpoint The dispatch endpoint.
     * @param description The contract description.
     * @hidden
     */
    private _applyContractBehaviors(endpoint, description);
    /**
     * Applies operation behaviors to the dispatch operation.
     * @param operation The dispatch operation.
     * @param description The operation description.
     * @hidden
     */
    private _applyOperationBehaviors(operation, description);
}
/**
 * Interface for a constructor.
 */
export interface Constructor<T> {
    name?: string;
    new (...args: any[]): T;
}
