diff --git a/docs/guide/walkthrough/services.md b/docs/guide/walkthrough/services.md index 523556903..c72800da3 100644 --- a/docs/guide/walkthrough/services.md +++ b/docs/guide/walkthrough/services.md @@ -2,11 +2,12 @@ sidebar_position: 6 --- +# Services + :::tip This is version 3 api only!! ::: -# Services :::tip TLDR: The direct upgrade to useContainer. if you set up a bot with create-bot, check dependencies.d.ts. @@ -46,16 +47,110 @@ export default commandModule({ } // }) +``` + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + +## Safety +- Services cannot be called in other services while makeDependencies is forming. + + + + + +Lets pass a logger into our database. +```ts title="index.ts" showLineNumbers +await makeDependencies({ + build: root => root + //Overriding the default logger provided. + .upsert({ '@sern/logger': single(() => new Logger()) }) + + // Wiring our logger into the database. + .add(ctx => { + return { database: single(() => new Database(ctx['sern/logger']))) } + }) +}) +``` + + + + +```ts title="index.ts" showLineNumbers +await makeDependencies({ + build: root => root + //Overriding the default logger provided. + .upsert({ '@sern/logger': single(() => new Logger()) }) + + // Wiring our logger into the database. + // We wire our database incorrectly. Logger should be passed INTO the constructor + .add({ database: single(() => new Database()) }) +}) +``` + +```ts title="index.ts" showLineNumbers +import { Service, makeDependencies } from '@sern/handler'; + +//Calling Service prematurely! +const logger = Service('@sern/logger'); +class Database { + + constructor() { + this.logger = logger + } +} ``` -## Safety +This is a code smell anyway. It breaks encapsulation and defeats the purpose of wiring dependencies + + + +- Services can only be used after sern has made dependencies. + - Calling a service before will crash your application. +- Services can be safely used outside of commandModules. + - Be careful to not cause too many side effects. + + + +- You will need to wire dependencies together. + + + + +```ts title="index.ts" showLineNumbers +await makeDependencies(...pass your options here) +``` +```ts title="commands/ping.ts" showLineNumbers +// This is guaranteed to be defined if configured correctly +import { Service } from '@sern/handler'; +const client = Service('@sern/client'); +``` + + + + + +```ts title="index.ts" showLineNumbers +import { Service, makeDependencies } from '@sern/handler'; +/* DON'T USE SERVICES BEFORE CALLING makeDependencies */ +const logger = Service('@sern/logger'); + +await makeDependencies() +``` + + + + + - Services can only be used after sern has made dependencies. - Calling a service before will crash your application. -- Services can be safely used outside of commandModules. +- Services can be safely used outside of commandModules. - Be careful to not cause too many side effects. -## Related api +## Related api - use `Service` for single dependency. - use `Services` for multiple dependencies.