Compartilhar via


Serviços de tempo de design

Alguns serviços usados pelas ferramentas são usados apenas em tempo de projeto. Esses serviços são gerenciados separadamente dos serviços de runtime do EF Core para impedir que eles sejam implantados com seu aplicativo. Para substituir um desses serviços (por exemplo, o serviço para gerar arquivos de migração), adicione uma implementação de IDesignTimeServices ao seu projeto de inicialização.

internal class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection services)
        => services.AddSingleton<IMigrationsCodeGenerator, MyMigrationsCodeGenerator>();
}

Referenciando Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design é um pacote DevelopmentDependency. Isso significa que a dependência não fluirá transitivamente para outros projetos e que você não pode, por padrão, referenciar seus tipos.

Para referenciar seus tipos e sobrescrever serviços de design-time, atualize os metadados do item PackageReference no arquivo de projeto.

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0">
  <PrivateAssets>all</PrivateAssets>
  <!-- Remove IncludeAssets to allow compiling against the assembly -->
  <!--<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>-->
</PackageReference>

Se o pacote estiver sendo referenciado transitivamente por meio de Microsoft.EntityFrameworkCore.Tools, você precisará adicionar um PackageReference explícito ao pacote e alterar seus metadados.

Lista de serviços

Veja a seguir uma lista dos serviços disponíveis durante o tempo de design.

Service Description
IAnnotationCodeGenerator Gera o código para as anotações correspondentes do modelo.
ICSharpHelper Ajuda na geração de código C#.
IPluralizer Pluraliza e singulariza palavras.
ICSharpMigrationOperationGenerator Gera código C# para operações de migração.
ICSharpSnapshotGenerator Gera código C# para instantâneos de modelo.
IMigrationsCodeGenerator Gera código para uma migração.
IMigrationsCodeGeneratorSelector Seleciona o gerador de código de migrações apropriado.
IMigrationsScaffolder A classe principal para gerenciar arquivos de migração.
ICompiledModelCodeGenerator Gera código para metadados de modelo compilados.
ICompiledModelCodeGeneratorSelector Seleciona o gerador de código do modelo compilado apropriado.
ICompiledModelScaffolder A classe principal para a estruturação de modelos compilados.
IDatabaseModelFactory Cria um modelo de banco de dados de um banco de dados.
IModelCodeGenerator Gera código para um modelo.
IModelCodeGeneratorSelector Seleciona o gerador de código de modelo apropriado.
IProviderConfigurationCodeGenerator Gera código para a função OnConfiguring.
IReverseEngineerScaffolder A classe principal para a geração de modelos de engenharia reversa.
IScaffoldingModelFactory Cria um modelo a partir de um modelo de banco de dados.
IPrecompiledQueryCodeGenerator Gera código para consultas pré-compiladas.
IPrecompiledQueryCodeGeneratorSelector Seleciona o gerador de código de consulta pré-compilado apropriado.

Usando serviços

Esses serviços também podem ser úteis para criar suas próprias ferramentas. Por exemplo, quando você deseja automatizar parte do fluxo de trabalho em tempo de design.

Você pode criar um provedor de serviços que contém esses serviços usando os métodos de extensão AddEntityFrameworkDesignTimeServices e AddDbContextDesignTimeServices.

using var db = new MyDbContext();

// Create design-time services
var serviceCollection = new ServiceCollection();
serviceCollection.AddDbContextDesignTimeServices(db);

var provider = db.GetService<IDatabaseProvider>().Name;
var providerAssembly = Assembly.Load(new AssemblyName(provider));
var providerServicesAttribute = providerAssembly.GetCustomAttribute<DesignTimeProviderServicesAttribute>();
var designTimeServicesType = providerAssembly.GetType(providerServicesAttribute.TypeName, throwOnError: true);
((IDesignTimeServices)Activator.CreateInstance(designTimeServicesType)!).ConfigureDesignTimeServices(serviceCollection);

serviceCollection.AddEntityFrameworkDesignTimeServices();

var serviceProvider = serviceCollection.BuildServiceProvider();

// Add a migration
var migrationsScaffolder = serviceProvider.GetRequiredService<IMigrationsScaffolder>();
var migration = migrationsScaffolder.ScaffoldMigration(migrationName, rootNamespace);
migrationsScaffolder.Save(projectDir, migration, outputDir);