-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Expand file tree
/
Copy pathDesignTimeServiceCollectionExtensions.cs
More file actions
108 lines (100 loc) · 6.57 KB
/
DesignTimeServiceCollectionExtensions.cs
File metadata and controls
108 lines (100 loc) · 6.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.EntityFrameworkCore.Design.Internal;
using Microsoft.EntityFrameworkCore.Migrations.Design;
using Microsoft.EntityFrameworkCore.Migrations.Design.Internal;
using Microsoft.EntityFrameworkCore.Migrations.Internal;
using Microsoft.EntityFrameworkCore.Query.Internal;
using Microsoft.EntityFrameworkCore.Scaffolding.Internal;
namespace Microsoft.EntityFrameworkCore.Design;
/// <summary>
/// Extension methods for adding Entity Framework Core design-time services to an
/// <see cref="IServiceCollection" />.
/// </summary>
/// <remarks>
/// See <see href="https://aka.ms/efcore-docs-design-time-services">EF Core design-time services</see> for more information and examples.
/// </remarks>
public static class DesignTimeServiceCollectionExtensions
{
/// <summary>
/// Adds the Entity Framework Core design-time services.
/// </summary>
/// <remarks>
/// See <see href="https://aka.ms/efcore-docs-design-time-services">EF Core design-time services</see> for more information and examples.
/// </remarks>
/// <param name="services">The <see cref="IServiceCollection" /> the services will be added to.</param>
/// <param name="reporter">Used to report design-time messages.</param>
/// <param name="applicationServiceProviderAccessor">An accessor to the application service provider.</param>
/// <returns>The <paramref name="services" />. This enables chaining additional method calls.</returns>
public static IServiceCollection AddEntityFrameworkDesignTimeServices(
this IServiceCollection services,
IOperationReporter? reporter = null,
Func<IServiceProvider>? applicationServiceProviderAccessor = null)
{
reporter ??= new OperationReporter(handler: null);
new EntityFrameworkRelationalDesignServicesBuilder(services)
.TryAddProviderSpecificServices(services => services
.TryAddSingleton<CSharpMigrationOperationGeneratorDependencies, CSharpMigrationOperationGeneratorDependencies>()
.TryAddSingleton<CSharpMigrationsGeneratorDependencies, CSharpMigrationsGeneratorDependencies>()
.TryAddSingleton<CSharpSnapshotGeneratorDependencies, CSharpSnapshotGeneratorDependencies>()
.TryAddSingleton<ICandidateNamingService, CandidateNamingService>()
.TryAddSingleton<ICSharpHelper, CSharpHelper>()
.TryAddSingleton<ICSharpMigrationOperationGenerator, CSharpMigrationOperationGenerator>()
.TryAddSingleton<ICSharpSnapshotGenerator, CSharpSnapshotGenerator>()
.TryAddSingleton<ICSharpUtilities, CSharpUtilities>()
.TryAddSingleton(reporter)
.TryAddSingleton<IMigrationsCodeGenerator, CSharpMigrationsGenerator>()
.TryAddSingleton<IMigrationsCodeGeneratorSelector, MigrationsCodeGeneratorSelector>()
.TryAddSingletonEnumerable<IModelCodeGenerator, TextTemplatingModelGenerator>()
.TryAddSingletonEnumerable<IModelCodeGenerator, CSharpModelGenerator>()
.TryAddSingleton<IModelCodeGeneratorSelector, ModelCodeGeneratorSelector>()
.TryAddSingleton<ICompiledModelCodeGenerator, CSharpRuntimeModelCodeGenerator>()
.TryAddSingleton<ICompiledModelCodeGeneratorSelector, CompiledModelCodeGeneratorSelector>()
.TryAddSingleton<ICompiledModelScaffolder, CompiledModelScaffolder>()
.TryAddSingleton<IPrecompiledQueryCodeGenerator, PrecompiledQueryCodeGenerator>()
.TryAddSingleton<IPrecompiledQueryCodeGeneratorSelector, PrecompiledQueryCodeGeneratorSelector>()
.TryAddSingleton<IDesignTimeConnectionStringResolver>(
new DesignTimeConnectionStringResolver(applicationServiceProviderAccessor))
.TryAddSingleton<IPluralizer, HumanizerPluralizer>()
.TryAddSingleton<IScaffoldingModelFactory, RelationalScaffoldingModelFactory>()
.TryAddSingleton<MigrationsCodeGeneratorDependencies, MigrationsCodeGeneratorDependencies>()
.TryAddSingleton<ModelCodeGeneratorDependencies, ModelCodeGeneratorDependencies>()
.TryAddScoped<IReverseEngineerScaffolder, ReverseEngineerScaffolder>()
.TryAddScoped<MigrationsScaffolderDependencies, MigrationsScaffolderDependencies>()
.TryAddScoped<IMigrationsScaffolder, MigrationsScaffolder>()
.TryAddScoped<ISnapshotModelProcessor, SnapshotModelProcessor>()
.TryAddSingleton<IMigrationCompiler, CSharpMigrationCompiler>());
var loggerFactory = new LoggerFactory(
[new OperationLoggerProvider(reporter)], new LoggerFilterOptions { MinLevel = LogLevel.Debug });
services.AddScoped<ILoggerFactory>(_ => loggerFactory);
return services;
}
/// <summary>
/// Adds services from the <see cref="DbContext" /> which are used at design time.
/// </summary>
/// <remarks>
/// See <see href="https://aka.ms/efcore-docs-design-time-services">EF Core design-time services</see> for more information and examples.
/// </remarks>
/// <param name="services">The <see cref="IServiceCollection" /> the services will be added to.</param>
/// <param name="context">The <see cref="DbContext" /> the services will be added from.</param>
/// <returns>The <paramref name="services" />. This enables chaining additional method calls.</returns>
public static IServiceCollection AddDbContextDesignTimeServices(
this IServiceCollection services,
DbContext context)
{
new EntityFrameworkRelationalServicesBuilder(services)
.TryAdd(context.GetService<IDatabaseProvider>())
.TryAdd(_ => context.GetService<IMigrationsIdGenerator>())
.TryAdd(_ => context.GetService<IRelationalTypeMappingSource>())
.TryAdd(_ => context.GetService<IModelRuntimeInitializer>())
.TryAdd(_ => context.GetService<LoggingDefinitions>())
.TryAdd(_ => context.GetService<ICurrentDbContext>())
.TryAdd(_ => context.GetService<IDbContextOptions>())
.TryAdd(_ => context.GetService<IHistoryRepository>())
.TryAdd(_ => context.GetService<IMigrationsAssembly>())
.TryAdd(_ => context.GetService<IMigrationsModelDiffer>())
.TryAdd(_ => context.GetService<IMigrator>())
.TryAdd(_ => context.GetService<IDesignTimeModel>().Model);
return services;
}
}