Files
medusa-store/docs/content/development/fundamentals/dependency-injection.md
Shahed Nasser 6f1b49af03 chore: merge docs from master to develop (#3650)
* Fix issue on fixed total amount discount when using includes tax (#3472)

The calculation of the fixed discount amount breaks when having includes_tax setting active, due to the line item totals are incorrect and returning everything as 0, thus the totalItemPercentage will be Infinitiy due to the division by a subtotal of 0

* chore: Add missing changeset for @medusajs/medusa

* feat(medusa): Improve performance of Products domain (#3417)

* feat(medusa): Improve product update performances

* fix tests and update

* update mock repo

* improve repo

* cleanup

* fix

* cleanup + bulk emit + unit test fix

* improvements

* improve

* fix unit tests

* fix export

* fix product update handler

* enhance mock repo

* fix import integration

* fix end point tests

* revert mock repo product variant

* fix unit

* cleanup

* cleanup

* address feedback

* fix quotes in tests

* address feedback

* Create new-tips-mate.md

* use types

* chore: Remove integration-tests from changeset

* chore(release): v1.7.14

* chore(docs): Generated Docs Announcement Bar (automated) (#3489)

Co-authored-by: olivermrbl <olivermrbl@users.noreply.github.com>

* fix(medusa): EventBusService.emit using Redis mock (#3491)

* Fix eventBusService.emit using redis mock

* revert gitignore

* enqueuer

* unit test add redis_url

* fix test

* chore(docs): Generated Services Reference (automated) (#3490)

Co-authored-by: olivermrbl <olivermrbl@users.noreply.github.com>

* docs: publish restructure (#3496)

* docs: added features and guides overview page

* added image

* added version 2

* added version 3

* added version 4

* docs: implemented new color scheme

* docs: redesigned sidebar (#3193)

* docs: redesigned navbar for restructure (#3199)

* docs: redesigned footer (#3209)

* docs: redesigned cards (#3230)

* docs: redesigned admonitions (#3231)

* docs: redesign announcement bar (#3236)

* docs: redesigned large cards (#3239)

* docs: redesigned code blocks (#3253)

* docs: redesigned search modal and page (#3264)

* docs: redesigned doc footer (#3268)

* docs: added new sidebars + refactored css and assets (#3279)

* docs: redesigned api reference sidebar

* docs: refactored css

* docs: added code tabs transition

* docs: added new sidebars

* removed unused assets

* remove unusued assets

* Fix deploy errors

* fix incorrect link

* docs: fixed code responsivity + missing icons (#3283)

* docs: changed icons (#3296)

* docs: design fixes to the sidebar (#3297)

* redesign fixes

* docs: small design fixes

* docs: several design fixes after restructure (#3299)

* docs: bordered icon fixes

* docs: desgin fixes

* fixes to code blocks and sidebar scroll

* design adjustments

* docs: restructured homepage (#3305)

* docs: restructured homepage

* design fixes

* fixed core concepts icon

* docs: added core concepts page (#3318)

* docs: restructured homepage

* design fixes

* docs: added core concepts page

* changed text of different components

* docs: added architecture link

* added missing prop for user guide

* docs: added regions overview page (#3327)

* docs: added regions overview

* moved region pages to new structure

* docs: fixed description of regions architecture page

* small changes

* small fix

* docs: added customers overview page (#3331)

* docs: added regions overview

* moved region pages to new structure

* docs: fixed description of regions architecture page

* small changes

* small fix

* docs: added customers overview page

* fix link

* resolve link issues

* docs: updated regions architecture image

* docs: second-iteration fixes (#3347)

* docs: redesigned document

* design fixes

* docs: added products overview page (#3354)

* docs: added carts overview page (#3363)

* docs: added orders overview (#3364)

* docs: added orders overview

* added links in overview

* docs: added vercel redirects

* docs: added soon badge for cards (#3389)

* docs: resolved feedback changes + organized troubleshooting pages (#3409)

* docs: resolved feedback changes

* added extra line

* docs: changed icons for restructure (#3421)

* docs: added taxes overview page (#3422)

* docs: added taxes overview page

* docs: fix sidebar label

* added link to taxes overview page

* fixed link

* docs: fixed sidebar scroll (#3429)

* docs: added discounts overview (#3432)

* docs: added discounts overview

* fixed links

* docs: added gift cards overview (#3433)

* docs: added price lists overview page (#3440)

* docs: added price lists overview page

* fixed links

* docs: added sales channels overview page (#3441)

* docs: added sales overview page

* fixed links

* docs: added users overview (#3443)

* docs: fixed sidebar border height (#3444)

* docs: fixed sidebar border height

* fixed svg markup

* docs: added possible solutions to feedback component (#3449)

* docs: added several overview pages + restructured files (#3463)

* docs: added several overview pages

* fixed links

* docs: added feature flags + PAK overview pages (#3464)

* docs: added feature flags + PAK overview pages

* fixed links

* fix link

* fix link

* fixed links colors

* docs: added strategies overview page (#3468)

* docs: automated upgrade guide (#3470)

* docs: automated upgrade guide

* fixed vercel redirect

* docs: restructured files in docs codebase (#3475)

* docs: restructured files

* docs: fixed eslint exception

* docs: finished restructure loose-ends (#3493)

* fixed uses of backend

* docs: finished loose ends

* eslint fixes

* fixed links

* merged master

* added update instructions for v1.7.12

* docs: fixed discount details (#3499)

* docs: fix trailing slash causing 404 (#3508)

* docs: fix error during navigation (#3509)

* docs: removed the gatsby storefront guide (#3527)

* docs: removed the gatsby storefront guide

* docs: fixed query value

* chore(docs): Removed Docs Announcement Bar (automated) (#3536)

Co-authored-by: shahednasser <shahednasser@users.noreply.github.com>

* fix(medusa): Variant update should include the id for the listeners to be able to identify the entity (#3539)

* fix(medusa): Variant update should include the id for the listeners to be able to identify the entity

* fix unit tests

* Create brave-seahorses-film.md

* docs: fix admin redirects (#3548)

* chore(release): v1.7.15

* chore(docs): Generated Docs Announcement Bar (automated) (#3550)

Co-authored-by: olivermrbl <olivermrbl@users.noreply.github.com>

* chore(docs): Generated Services Reference (automated) (#3551)

Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action

Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>

* chore: updated READMEs of plugins (#3546)

* chore: updated READMEs of plugins

* added notice to plugins

* docs: added a deploy guide for next.js storefront (#3558)

* docs: added a deploy next.js guide

* docs: fix image zoom

* docs: fixes to next.js deployment guide to vercel (#3562)

* chore(workflows): Enable manual workflow in pre-release mode (#3566)

* chore(docs): Removed Docs Announcement Bar (automated) (#3598)

Co-authored-by: shahednasser <shahednasser@users.noreply.github.com>

* fix(medusa): Rounding issues on line item adjustments (#3446)

* chores(medusa): Attempt to fix discount rounding issues

* add migration

* update entities

* apply multipler factor properly

* fix discount service

* WIP

* fix rounding issues in discounts

* fix some tests

* Exclude raw_discount_total from responses

* fix adjustments

* cleanup response

* fix

* fix draft order integration

* fix order integration

* fix order integration

* address feedback

* fix test

* Create .changeset/polite-llamas-sit.md

* remove comment

---------

Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>

* chore(workflows): Add release notification (#3629)

---------

Co-authored-by: pepijn-vanvlaanderen <pepijn@webbers.com>
Co-authored-by: olivermrbl <oliver@mrbltech.com>
Co-authored-by: Adrien de Peretti <adrien.deperetti@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: olivermrbl <olivermrbl@users.noreply.github.com>
Co-authored-by: Carlos R. L. Rodrigues <37986729+carlos-r-l-rodrigues@users.noreply.github.com>
Co-authored-by: shahednasser <shahednasser@users.noreply.github.com>
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
2023-03-31 09:34:38 +02:00

9.8 KiB
Raw Blame History

description
description
Learn what the dependency container is and how to use it in Medusa. Learn also what dependency injection is, and what the resources regsitered and their names are.

Dependency Injection

In this document, youll learn what the dependency injection is and how you can use it in Medusa.

Introduction

What is Dependency Injection

Dependency Injection is the act of delivering the required resources to a class. These resources are the classs dependencies. This is usually done by passing (or injecting) the dependencies in the constructor of the class.

Generally, all resources are registered in a container. Then, whenever a class depends on one of these resources, the system retrieves the resources from the container and injects them into the classs constructor.

Medusas Dependency Container

Medusa uses a dependency container to register essential resources of the backend. You can then access these resources in classes and endpoints using the dependency container.

For example, if you create a custom service, you can access any other service registered in Medusa in your services constructor. That includes Medusas core services, services defined in plugins, or other services that you create on your backend.

You can load more than services in your Medusa backend. You can load the Entity Manager, logger instance, and much more.

MedusaContainer

To manage dependency injections, Medusa uses Awilix. Awilix is an NPM package that implements dependency injection in Node.js projects.

When you run the Medusa backend, a container of the type MedusaContainer is created. This type extends the AwilixContainer object.

The backend then registers all important resources in the container, which makes them accessible in classes and endpoints.


Registered Resources

The Medusa backend scans the core Medusa package, plugins, and your files in the dist directory and registers the following resources:

:::note

Many resources are registered under their camel-case name. These resources are formatted by taking the name of the file, transforming it to camel case, then appending the folder name to the name. So, the services/product.ts service is registered as productService.

:::

Resource

Description

Registration Name

Configurations

The configurations that are exported from medusa-config.js.

configModule

Services

Services that extend the TransactionBaseService class.

Each service is registered under its camel-case name. For example, the ProductService is registered as productService.

Entity Manager

An instance of Typeorms Entity Manager.

manager

Logger

An instance of Medusa CLIs logger. You can use it to log messages to the terminal.

logger

Single Payment Provider

An instance of every payment provider that extends the AbstractPaymentService class.

Every payment provider is registered under two names:

  • Its camel-case name. For example, the StripeProviderService is registered as stripeProviderService.
  • pp_ followed by its identifier. For example, the StripeProviderService is registered as pp_stripe.

All Payment Providers

An array of all payment providers that extend the AbstractPaymentService class.

paymentProviders

Single Fulfillment Provider

An instance of every fulfillment provider that extends the FulfillmentService class.

Every fulfillment provider is registered under two names:

  • Its camel-case name. For example, the WebshipperFulfillmentService is registered as webshipperFulfillmentService.
  • fp_ followed by its identifier. For example, the WebshipperFulfillmentService is registered as fp_webshipper.

All Fulfillment Providers

An array of all fulfillment providers that extend the FulfillmentService class.

fulfillmentProviders

Single Notification Provider

An instance of every notification provider that extends the AbstractNotificationService or the BaseNotificationService classes.

Every notification provider is registered under two names:

  • Its camel-case name. For example, the SendGridService is registered as sendGridService.
  • noti_ followed by its identifier. For example, the SendGridService is registered as noti_sendgrid.

All Notification Providers

An array of all notification providers that extend the AbstractNotificationService or the BaseNotificationService classes.

notificationProviders

File Service

An instance of the class that extends the FileService class, if any.

The file service is registered under two names:

  • Its camel-case name. For example, the MinioService is registered as minioService.
  • fileService

Search Service

An instance of the class that extends the AbstractSearchService or the SearchService classes, if any.

The search service is registered under two names:

  • Its camel-case name. For example, the AlgoliaService is registered as algoliaService.
  • searchService

Single Tax Provider

An instance of every tax provider that extends the AbstractTaxService class.

The tax provider is registered under two names:

  • Its camel-case name.
  • tp_ followed by its identifier.

All Tax Providers

An array of every tax provider that extends the AbstractTaxService class.

taxProviders

Oauth Services

An instance of every service that extends the OauthService class.

Each Oauth Service is registered under its camel-case name followed by Oauth.

Feature Flag Router

An instance of the FlagRouter. This can be used to list feature flags, set a feature flags value, or check if theyre enabled.

featureFlagRouter

Redis

An instance of the Redis client. If Redis is not configured, a fake Redis client is registered.

redisClient

Single Entity

An instance of every entity.

Each entity is registered under its camel-case name followed by Model. For example, the CustomerGroup entity is stored under customerGroupModel.

All Entities

An array of all database entities that is passed to Typeorm when connecting to the database.

db_entities

Repositories

An instance of each repository.

Each repository is registered under its camel-case name. For example, CustomerGroupRepository is stored under customerGroupRepository.

Single Batch Job Strategy

An instance of every class extending the AbstractBatchJobStrategy class.

Each batch job strategy is registered under three names:

  • Its camel-case name. For example, ProductImportStrategy is registered as productImportStrategy.
  • batch_ followed by its identifier. For example, the ProductImportStrategy is registered under batch_product-import-strategy.
  • batchType_ followed by its batch job type. For example, the ProductImportStrategy is registered under batchType_product-import.

All Batch Job Strategies

An array of all classes extending the AbstractBatchJobStrategy abstract class.

batchJobStrategies

Tax Calculation Strategy

An instance of the class implementing the ITaxCalculationStrategy interface.

taxCalculationStrategy

Cart Completion Strategy

An instance of the class extending the AbstractCartCompletionStrategy class.

cartCompletionStrategy

Price Selection Strategy

An instance of the class implementing the IPriceSelectionStrategy interface.

priceSelectionStrategy

Strategies

An instance of strategies that arent of the specific types mentioned above and that are under the strategies directory.

Its camel-case name.


Loading Resources

This section covers how to load resources that the Medusa backend registers when it starts running.

In Endpoints

To load resources, such as services, in endpoints, use the req.scope.resolve function. The function receives the registration name of the resource as a parameter.

For example:

const logger = req.scope.resolve("logger")

Please note that in endpoints some resources, such as repositories, are not available.

In Classes

In classes such as services, strategies, or subscribers, you can load resources in the constructor function. The constructor receives an object of dependencies as a first parameter. Each dependency in the object should use the registration name of the resource that should be injected to the class.

For example:

import { OrderService } from "@medusajs/medusa"

class OrderSubscriber {
  protected orderService: OrderService

  constructor({ orderService }) {
    this.orderService = orderService
  }
}

See Also