- Começar a usar
- Produto
- Recursos
- Ferramentas e SDKs
- Estrutura
- Referência
- Get Started
- Product
- Resources
- Tools & SDKs
- Framework
- Reference
2.2. Contêiner Medusa
Neste capítulo, você aprenderá sobre o contêiner Medusa e como usá-lo.
O que é o contêiner Medusa? #
O contêiner Medusa é um registro de ferramentas de estrutura e comércio que pode ser acessado em todo o seu aplicativo. O Medusa registra automaticamente essas ferramentas no contêiner, inclusive as personalizadas que você criou, para que você possa usá-las em suas personalizações.
Em outras plataformas, se você tiver um recurso A (por exemplo, uma classe) que dependa de um recurso B, será necessário adicionar manualmente o recurso B ao contêiner ou especificá-lo antecipadamente como dependência de A, o que geralmente é feito em um arquivo separado do código de A. Isso se torna difícil de gerenciar à medida que você mantém aplicativos maiores com muitas dependências variáveis.
O Medusa simplifica esse processo dando-lhe acesso ao contêiner, com as ferramentas ou os recursos já registrados, em todos os momentos de suas personalizações. Quando chegar a um ponto do seu código em que precise de uma ferramenta, resolva-a no contêiner e use-a.
Por exemplo, considere que você está criando uma rota de API que recupera produtos com base em filtros usando o Query, uma ferramenta que busca dados em todo o aplicativo. Na função da rota de API, você pode resolver o Query a partir do contêiner passado para a rota de API e usá-lo:
1import { MedusaRequest, MedusaResponse } from "@medusajs/framework"2import { ContainerRegistrationKeys } from "@medusajs/framework/utils"3 4export async function GET(5 req: MedusaRequest,6 res: MedusaResponse7) {8 const query = req.scope.resolve(9 ContainerRegistrationKeys.QUERY10 )11 12 const { data: products } = await query.graph({13 entity: "product",14 fields: ["*"],15 filters: {16 id: "prod_123",17 },18 })19 20 res.json({21 products,22 })23}
A rota da API aceita como primeiro parâmetro um objeto de solicitação que tem uma propriedade scope
, que é o contêiner do Medusa. Ela tem um método resolve
que resolve um recurso do contêiner pela chave com a qual ele está registrado.
Para resolver a Query, você usa o enum ContainerRegistrationKeys
importado de @medusajs/framework/utils
, que tem as chaves de registro para todas as ferramentas e recursos da estrutura.
Lista de recursos registrados no contêiner Medusa #
Encontre uma lista completa dos recursos registrados e sua chave de registro nesta referência
Como resolver a questão do contêiner da Medusa #
Esta seção fornece exemplos rápidos de como resolver recursos do contêiner Medusa em personalizações diferentes de uma rota de API, que é abordada na seção acima.
Assinante #
Uma função de assinante, que é executada quando um evento é emitido, aceita como parâmetro um objeto com uma propriedade container
, cujo valor é o contêiner Medusa. Use seu método resolve
para resolver um recurso por sua chave de registro:
1import { SubscriberArgs, type SubscriberConfig } from "@medusajs/framework"2import { ContainerRegistrationKeys } from "@medusajs/framework/utils"3 4export default async function productCreateHandler({5 event: { data },6 container,7}: SubscriberArgs<{ id: string }>) {8 const query = container.resolve(ContainerRegistrationKeys.QUERY)9 10 const { data: products } = await query.graph({11 entity: "product",12 fields: ["*"],13 filters: {14 id: data.id,15 },16 })17 18 console.log(`You created a product with the title ${products[0].title}`)19}20 21export const config: SubscriberConfig = {22 event: `product.created`,23}
Trabalho programado #
Uma função de trabalho agendada, que é executada em um intervalo especificado, aceita o contêiner Medusa como parâmetro. Use o método resolve
para resolver um recurso por sua chave de registro:
1import { MedusaContainer } from "@medusajs/framework/types"2import { ContainerRegistrationKeys } from "@medusajs/framework/utils"3 4export default async function myCustomJob(5 container: MedusaContainer6) {7 const query = container.resolve(ContainerRegistrationKeys.QUERY)8 9 const { data: products } = await query.graph({10 entity: "product",11 fields: ["*"],12 filters: {13 id: "prod_123",14 },15 })16 17 console.log(18 `You have ${products.length} matching your filters.`19 )20}21 22export const config = {23 name: "every-minute-message",24 // execute every minute25 schedule: "* * * * *",26}
Etapa do fluxo de trabalho #
Uma etapa em um fluxo de trabalho, que é uma função especial na qual você cria uma lógica comercial confiável, aceita em seu segundo parâmetro uma propriedade container
, cujo valor é o contêiner Medusa. Use o método resolve
para resolver um recurso por sua chave de registro:
1import {2 createStep,3 StepResponse,4} from "@medusajs/framework/workflows-sdk"5import { ContainerRegistrationKeys } from "@medusajs/framework/utils"6 7const step1 = createStep("step-1", async (_, { container }) => {8 const query = container.resolve(ContainerRegistrationKeys.QUERY)9 10 const { data: products } = await query.graph({11 entity: "product",12 fields: ["*"],13 filters: {14 id: "prod_123",15 },16 })17 18 return new StepResponse(products)19})
Serviços e carregadores de módulos #
Um módulo, que é um pacote de funcionalidades para um único recurso ou domínio, tem seu próprio contêiner, portanto não pode resolver recursos do contêiner do Medusa.
Saiba mais sobre o contêiner do módulo neste capítulo.
Este capítulo foi útil?