Skip to content

Commit 05334ed

Browse files
authored
Merge pull request #5607 from Particular/john/ef_projects
Added the skeleton projects for EF
2 parents 16d6a9b + 09a60ee commit 05334ed

54 files changed

Lines changed: 1066 additions & 3 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/Directory.Packages.props

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@
3030
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="10.7.0" />
3131
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.19.1" />
3232
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.19.1" />
33+
<!-- EF Core patch version must not exceed RuntimeFrameworkVersion (Custom.Build.props), which pins the Microsoft.Extensions.* packages -->
34+
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="$(RuntimeFrameworkVersion)" />
35+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="$(RuntimeFrameworkVersion)" />
36+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="$(RuntimeFrameworkVersion)" />
37+
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(RuntimeFrameworkVersion)" />
38+
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.3" />
3339
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.8.1" />
3440
<PackageVersion Include="Microsoft-WindowsAPICodePack-Shell" Version="1.1.5" />
3541
<PackageVersion Include="Mindscape.Raygun4Net.NetCore" Version="11.2.5" />
@@ -92,6 +98,8 @@
9298
<PackageVersion Include="System.IO.Hashing" Version="$(RuntimeFrameworkVersion)" />
9399
<PackageVersion Include="System.Security.Cryptography.Pkcs" Version="$(RuntimeFrameworkVersion)" />
94100
<PackageVersion Include="System.Threading.RateLimiting" Version="$(RuntimeFrameworkVersion)" />
101+
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.1.5" />
102+
<PackageVersion Include="Azure.Core" Version="1.53.0" />
95103
</ItemGroup>
96104
<ItemGroup>
97105
<GlobalPackageReference Include="Microsoft.Build.Artifacts" Version="6.1.63" />

src/ProjectReferences.Persisters.Primary.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<Project>
22

33
<ItemGroup Label="Persisters">
4+
<ProjectReference Include="..\ServiceControl.Persistence.EFCore.PostgreSql\ServiceControl.Persistence.EFCore.PostgreSql.csproj" ReferenceOutputAssembly="false" Private="false" />
5+
<ProjectReference Include="..\ServiceControl.Persistence.EFCore.SqlServer\ServiceControl.Persistence.EFCore.SqlServer.csproj" ReferenceOutputAssembly="false" Private="false" />
46
<ProjectReference Include="..\ServiceControl.Persistence.RavenDB\ServiceControl.Persistence.RavenDB.csproj" ReferenceOutputAssembly="false" Private="false" />
57
</ItemGroup>
68

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[*.cs]
2+
3+
# Justification: ServiceControl app has no synchronization context
4+
dotnet_diagnostic.CA2007.severity = none
5+
6+
# Disable style rules for auto-generated EF migrations
7+
[Migrations/**.cs]
8+
dotnet_diagnostic.IDE0065.severity = none
9+
generated_code = true
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
namespace ServiceControl.Persistence.EFCore.PostgreSql;
2+
3+
using Microsoft.EntityFrameworkCore;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using ServiceControl.Persistence.EFCore.Abstractions;
6+
7+
class PostgreSqlPersistence(PostgreSqlPersisterSettings settings) : BasePersistence, IPersistence
8+
{
9+
public void AddPersistence(IServiceCollection services)
10+
{
11+
RegisterSettings(services);
12+
ConfigureDbContext(services);
13+
RegisterDataStores(services);
14+
}
15+
16+
public void AddInstaller(IServiceCollection services)
17+
{
18+
RegisterSettings(services);
19+
ConfigureDbContext(services);
20+
}
21+
22+
void RegisterSettings(IServiceCollection services)
23+
{
24+
services.AddSingleton<PersistenceSettings>(settings);
25+
services.AddSingleton<EFPersisterSettings>(settings);
26+
services.AddSingleton(settings);
27+
}
28+
29+
void ConfigureDbContext(IServiceCollection services) =>
30+
services.AddPooledDbContextFactory<PostgreSqlServiceControlDbContext>(options =>
31+
options.UseNpgsql(settings.ConnectionString, npgsql => npgsql.CommandTimeout(settings.CommandTimeout)));
32+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace ServiceControl.Persistence.EFCore.PostgreSql;
2+
3+
using Microsoft.Extensions.Logging;
4+
using ServiceControl.Infrastructure;
5+
using ServiceControl.Persistence.EFCore.Abstractions;
6+
7+
class PostgreSqlPersistenceConfiguration : EFPersistenceConfigurationBase
8+
{
9+
public override IPersistence Create(PersistenceSettings settings)
10+
{
11+
// Temporary until the persister is fully implemented
12+
LoggerUtil.CreateStaticLogger<PostgreSqlPersistenceConfiguration>()
13+
.LogError("The PostgreSQL persistence is still under development and is not ready for use");
14+
15+
return new PostgreSqlPersistence((PostgreSqlPersisterSettings)settings);
16+
}
17+
18+
protected override EFPersisterSettings CreateSettings(string connectionString) =>
19+
new PostgreSqlPersisterSettings { ConnectionString = connectionString };
20+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace ServiceControl.Persistence.EFCore.PostgreSql;
2+
3+
using ServiceControl.Persistence.EFCore.Abstractions;
4+
5+
public class PostgreSqlPersisterSettings : EFPersisterSettings
6+
{
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace ServiceControl.Persistence.EFCore.PostgreSql;
2+
3+
using Microsoft.EntityFrameworkCore;
4+
using ServiceControl.Persistence.EFCore.DbContexts;
5+
6+
public class PostgreSqlServiceControlDbContext(DbContextOptions<PostgreSqlServiceControlDbContext> options) : ServiceControlDbContext(options)
7+
{
8+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace ServiceControl.Persistence.EFCore.PostgreSql;
2+
3+
using Microsoft.EntityFrameworkCore;
4+
using Microsoft.EntityFrameworkCore.Design;
5+
6+
/// <summary>
7+
/// Design-time factory used by the dotnet-ef tooling (e.g. dotnet ef migrations add).
8+
/// </summary>
9+
public class PostgreSqlServiceControlDbContextFactory : IDesignTimeDbContextFactory<PostgreSqlServiceControlDbContext>
10+
{
11+
public PostgreSqlServiceControlDbContext CreateDbContext(string[] args)
12+
{
13+
var connectionString = Environment.GetEnvironmentVariable("SERVICECONTROL_DATABASE_CONNECTIONSTRING")
14+
?? "Host=localhost;Port=5432;Database=servicecontrol;Username=postgres;Password=postgres";
15+
16+
var optionsBuilder = new DbContextOptionsBuilder<PostgreSqlServiceControlDbContext>();
17+
optionsBuilder.UseNpgsql(connectionString);
18+
19+
return new PostgreSqlServiceControlDbContext(optionsBuilder.Options);
20+
}
21+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
8+
<DisableTransitiveProjectReferences>true</DisableTransitiveProjectReferences>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<!-- Private=false & ExcludeAssets=runtime prevent repeatedly including binary dependencies of ServiceControl.Persistence and its dependencies in each persister directory -->
13+
<ProjectReference Include="../ServiceControl.Configuration/ServiceControl.Configuration.csproj" Private="false" ExcludeAssets="runtime" />
14+
<ProjectReference Include="../ServiceControl.Infrastructure/ServiceControl.Infrastructure.csproj" Private="false" ExcludeAssets="runtime" />
15+
<ProjectReference Include="../ServiceControl.Persistence/ServiceControl.Persistence.csproj" Private="false" ExcludeAssets="runtime" />
16+
</ItemGroup>
17+
18+
<ItemGroup>
19+
<!-- Not Private=false or ExcludeAssets because the shared EF Core assembly ships inside this persister's folder -->
20+
<ProjectReference Include="../ServiceControl.Persistence.EFCore/ServiceControl.Persistence.EFCore.csproj" />
21+
</ItemGroup>
22+
23+
<ItemGroup>
24+
<!-- Design-time only, for dotnet-ef tooling. Debug-only so it (and its Roslyn dependency tail) stays out of the shipped Release artifact -->
25+
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" PrivateAssets="all" Condition="'$(Configuration)' == 'Debug'" />
26+
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
27+
</ItemGroup>
28+
29+
<ItemGroup>
30+
<None Update="persistence.manifest" CopyToOutputDirectory="PreserveNewest" />
31+
</ItemGroup>
32+
33+
<ItemGroup>
34+
<Artifact Include="$(OutputPath)" DestinationFolder="$(ArtifactsPath)Particular.ServiceControl/Persisters/PostgreSQL" />
35+
</ItemGroup>
36+
37+
</Project>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"Name": "PostgreSQL",
3+
"DisplayName": "PostgreSQL",
4+
"Description": "PostgreSQL ServiceControl persister",
5+
"AssemblyName": "ServiceControl.Persistence.EFCore.PostgreSql",
6+
"TypeName": "ServiceControl.Persistence.EFCore.PostgreSql.PostgreSqlPersistenceConfiguration, ServiceControl.Persistence.EFCore.PostgreSql",
7+
"Settings": [
8+
{
9+
"Name": "ServiceControl/Database/ConnectionString",
10+
"Mandatory": true
11+
},
12+
{
13+
"Name": "ServiceControl/Database/CommandTimeout",
14+
"Mandatory": false
15+
},
16+
{
17+
"Name": "ServiceControl/MessageBody/StoragePath",
18+
"Mandatory": false
19+
},
20+
{
21+
"Name": "ServiceControl/MessageBody/MinCompressionSize",
22+
"Mandatory": false
23+
}
24+
]
25+
}

0 commit comments

Comments
 (0)