This is a bilingual snapshot page saved by the user at 2024-11-30 22:37 for https://docs.medusajs.com/learn/basics/medusa-container, provided with bilingual support by Immersive Translate. Learn how to save?

 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:

Code
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.


Observação: Você pode saber mais sobre o funcionamento do Query neste capítulo.


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:

Code
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:

Code
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:

Code
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?
 Convenções do projeto
 Módulos
 Editar esta página