# Provider - Vapor Docs

Skip to content


# Using Providers

The `Provider` protocol make it easy to integrate external services into your application. All of Vapor's official packages, like Fluent, use the provider system to expose their services.

Providers can:

- Register services to your `Services` struct.
- Hook into your `Container`'s lifecycle.

## Register

Once you have added a Service-exposing SPM dependency to your project, adding the provider is easy.

    import Foo

    try services.register(FooProvider())

This is usually done in `configure.swift`.

Note

You can search GitHub for the `vapor-service` tag for a list of packages that expose services using this method.

## Create

Creating a custom provider can be a great way to organize your code. You will also want to create a provider if you are working on a third-party package for Vapor.

Here is what a simple provider would look like for the `Logger` examples from the Services section.

    public final class LoggerProvider: Provider {
        /// See `Provider`.
        public func register(_ services: inout Services) throws {
            services.register(PrintLogger.self)
            services.register(FileLogger.self)
        }

        /// See `Provider`.
        public func didBoot(_ container: Container) throws -> Future<Void> {
            let logger = try container.make(Logger.self)
            logger.log("Hello from LoggerProvider!")
            return .done(on: container)
        }
    }

Now when someone registers the `LoggerProvider` to their `Services` struct, it will automatically register the print and file loggers. When the container boots, the success message will be printed to verify the provider was added.

See the `Provider` protocol's API docs for more information.

## Comments