Skip to content

Commit 2e53cfb

Browse files
Added restful work related to conventions and so forth
1 parent 9ed8b38 commit 2e53cfb

File tree

91 files changed

+2312
-772
lines changed

Some content is hidden

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

91 files changed

+2312
-772
lines changed

Directory.Packages.props

+23-14
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<PackageVersion Include="Roslynator.Analyzers" Version="2.3.0"/>
1313
</ItemGroup>
1414
<ItemGroup>
15-
<PackageVersion Include="GitVersion.Tool" Version="5.3.6"/>
15+
<PackageVersion Include="GitVersion.Tool" Version="5.3.7"/>
1616
<PackageVersion Include="JetBrains.ReSharper.CommandLineTools" Version="2020.1.3"/>
1717
<PackageVersion Include="Nuke.Common" Version="0.25.0-alpha0292"/>
1818
<PackageVersion Include="ReportGenerator" Version="4.6.1"/>
@@ -23,20 +23,22 @@
2323
<PackageVersion Include="App.Metrics.AppNetCore" Version="4.1.0"/>
2424
<PackageVersion Include="App.Metrics.AspNetCore" Version="4.1.0"/>
2525
<PackageVersion Include="App.Metrics.Extensions.HealthChecks" Version="4.1.0"/>
26-
<PackageVersion Include="AutoMapper" Version="9.0.0"/>
27-
<PackageVersion Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="7.0.0"/>
2826
<PackageVersion Include="FluentValidation" Version="8.6.2"/>
2927
<PackageVersion Include="FluentValidation.AspNetCore" Version="8.6.2"/>
3028
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="8.6.2"/>
29+
<PackageVersion Include="Hellang.Middleware.ProblemDetails" Version="5.1.0" />
3130
<PackageVersion Include="Humanizer.Core" Version="2.8.26"/>
32-
<PackageVersion Include="MediatR" Version="8.0.1"/>
33-
<PackageVersion Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="8.0.0"/>
31+
<PackageVersion Include="MediatR" Version="8.0.2"/>
32+
<PackageVersion Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="8.0.1"/>
3433
<PackageVersion Include="MicroElements.Swashbuckle.FluentValidation" Version="3.2.0"/>
35-
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.0"/>
36-
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="3.1.0"/>
37-
<PackageVersion Include="Microsoft.Extensions.Logging" Version="3.1.0"/>
38-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0"/>
39-
<PackageVersion Include="Microsoft.Extensions.Options" Version="3.1.0"/>
34+
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.5"/>
35+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.5" />
36+
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="3.1.5" />
37+
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="3.1.5"/>
38+
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="3.1.5" />
39+
<PackageVersion Include="Microsoft.Extensions.Logging" Version="3.1.5"/>
40+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="3.1.5"/>
41+
<PackageVersion Include="Microsoft.Extensions.Options" Version="3.1.5"/>
4042
<PackageVersion Include="Microsoft.Reactive.Testing" Version="4.4.1"/>
4143
<PackageVersion Include="Newtonsoft.Json" Version="12.0.3"/>
4244
<PackageVersion Include="NodaTime" Version="3.0.0"/>
@@ -47,14 +49,21 @@
4749
<PackageVersion Include="Rocket.Surgery.Conventions" Version="10.0.0-beta.2"/>
4850
<PackageVersion Include="Rocket.Surgery.Conventions.Abstractions" Version="10.0.0-beta.2"/>
4951
<PackageVersion Include="Rocket.Surgery.Conventions.Attributes" Version="10.0.0-beta.2"/>
50-
<PackageVersion Include="Rocket.Surgery.DependencyInjection.Extensions" Version="2.3.1"/>
51-
<PackageVersion Include="Rocket.Surgery.Extensions" Version="2.3.1"/>
52+
<PackageVersion Include="Rocket.Surgery.Conventions.AutoMapper" Version="8.0.0-beta.2" />
53+
<PackageVersion Include="Rocket.Surgery.Extensions.Configuration" Version="10.0.0-beta.2"/>
54+
<PackageVersion Include="Rocket.Surgery.Extensions.Configuration.Json" Version="10.0.0-beta.2"/>
55+
<PackageVersion Include="Rocket.Surgery.Extensions.Configuration.Yaml" Version="10.0.0-beta.2"/>
56+
<PackageVersion Include="Rocket.Surgery.Extensions.Serilog" Version="11.0.0-beta.2"/>
57+
<PackageVersion Include="Rocket.Surgery.DependencyInjection.Extensions" Version="2.5.0"/>
58+
<PackageVersion Include="Rocket.Surgery.Extensions" Version="2.5.0"/>
5259
<PackageVersion Include="Rocket.Surgery.Hosting" Version="10.0.0-beta.2"/>
5360
<PackageVersion Include="Rocket.Surgery.Hosting.Abstractions" Version="10.0.0-beta.2"/>
54-
<PackageVersion Include="Rocket.Surgery.System" Version="2.3.1"/>
61+
<PackageVersion Include="Rocket.Surgery.System" Version="2.5.0"/>
62+
<PackageVersion Include="Scrutor" Version="3.2.1" />
5563
<PackageVersion Include="Swashbuckle.AspNetCore" Version="5.5.1"/>
5664
<PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="5.5.1"/>
5765
<PackageVersion Include="Swashbuckle.AspNetCore.Filters" Version="5.1.2"/>
66+
<PackageVersion Include="SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime" Version="1.3.0" />
5867
<PackageVersion Include="System.Collections.Immutable" Version="1.7.1"/>
5968
<PackageVersion Include="System.Interactive" Version="4.1.1"/>
6069
<PackageVersion Include="System.Interactive.Async" Version="4.1.1"/>
@@ -71,7 +80,7 @@
7180
<PackageVersion Include="FluentAssertions" Version="5.10.3"/>
7281
<PackageVersion Include="FluentAssertions.Analyzers" Version="0.11.4"/>
7382
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="16.6.1"/>
74-
<PackageVersion Include="Rocket.Surgery.Extensions.Testing.FakeItEasy" Version="5.1.1"/>
83+
<PackageVersion Include="Rocket.Surgery.Extensions.Testing.FakeItEasy" Version="5.2.0"/>
7584
<PackageVersion Include="xunit" Version="2.4.1"/>
7685
<PackageVersion Include="xunit.analyzers" Version="0.10.0"/>
7786
<PackageVersion Include="xunit.runner.visualstudio" Version="2.4.2"/>

LaunchPad.sln

+45
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Extensions.Tests", "test\Ex
4949
EndProject
5050
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{D65A8130-6A58-4693-A96C-8C1DFA3CA355}"
5151
EndProject
52+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rocket.Surgery.LaunchPad.Hosting", "src\Hosting\Rocket.Surgery.LaunchPad.Hosting.csproj", "{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}"
53+
EndProject
54+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.Core", "sample\Sample.Core\Sample.Core.csproj", "{FD33372B-4D2E-4F22-A866-6E01C2451FA4}"
55+
EndProject
56+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rocket.Surgery.LaunchPad.EntityFramework", "src\EntityFramework\Rocket.Surgery.LaunchPad.EntityFramework.csproj", "{2A39A833-558C-4054-8CEB-9293AEA38E18}"
57+
EndProject
5258
Global
5359
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5460
Debug|Any CPU = Debug|Any CPU
@@ -233,6 +239,42 @@ Global
233239
{75C55F46-7422-4E00-B41B-0DB5593B4641}.Release|x64.Build.0 = Release|Any CPU
234240
{75C55F46-7422-4E00-B41B-0DB5593B4641}.Release|x86.ActiveCfg = Release|Any CPU
235241
{75C55F46-7422-4E00-B41B-0DB5593B4641}.Release|x86.Build.0 = Release|Any CPU
242+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
243+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Debug|Any CPU.Build.0 = Debug|Any CPU
244+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Debug|x64.ActiveCfg = Debug|Any CPU
245+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Debug|x64.Build.0 = Debug|Any CPU
246+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Debug|x86.ActiveCfg = Debug|Any CPU
247+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Debug|x86.Build.0 = Debug|Any CPU
248+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Release|Any CPU.ActiveCfg = Release|Any CPU
249+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Release|Any CPU.Build.0 = Release|Any CPU
250+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Release|x64.ActiveCfg = Release|Any CPU
251+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Release|x64.Build.0 = Release|Any CPU
252+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Release|x86.ActiveCfg = Release|Any CPU
253+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F}.Release|x86.Build.0 = Release|Any CPU
254+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
255+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Debug|Any CPU.Build.0 = Debug|Any CPU
256+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Debug|x64.ActiveCfg = Debug|Any CPU
257+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Debug|x64.Build.0 = Debug|Any CPU
258+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Debug|x86.ActiveCfg = Debug|Any CPU
259+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Debug|x86.Build.0 = Debug|Any CPU
260+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Release|Any CPU.ActiveCfg = Release|Any CPU
261+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Release|Any CPU.Build.0 = Release|Any CPU
262+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Release|x64.ActiveCfg = Release|Any CPU
263+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Release|x64.Build.0 = Release|Any CPU
264+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Release|x86.ActiveCfg = Release|Any CPU
265+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4}.Release|x86.Build.0 = Release|Any CPU
266+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
267+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Debug|Any CPU.Build.0 = Debug|Any CPU
268+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Debug|x64.ActiveCfg = Debug|Any CPU
269+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Debug|x64.Build.0 = Debug|Any CPU
270+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Debug|x86.ActiveCfg = Debug|Any CPU
271+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Debug|x86.Build.0 = Debug|Any CPU
272+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Release|Any CPU.ActiveCfg = Release|Any CPU
273+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Release|Any CPU.Build.0 = Release|Any CPU
274+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Release|x64.ActiveCfg = Release|Any CPU
275+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Release|x64.Build.0 = Release|Any CPU
276+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Release|x86.ActiveCfg = Release|Any CPU
277+
{2A39A833-558C-4054-8CEB-9293AEA38E18}.Release|x86.Build.0 = Release|Any CPU
236278
EndGlobalSection
237279
GlobalSection(SolutionProperties) = preSolution
238280
HideSolutionNode = FALSE
@@ -256,5 +298,8 @@ Global
256298
{A8F0A232-3C70-4C9F-B35F-18B33D60D989} = {DF33E0FB-9790-4654-B60F-8AB22E0CC3D1}
257299
{75C55F46-7422-4E00-B41B-0DB5593B4641} = {DF33E0FB-9790-4654-B60F-8AB22E0CC3D1}
258300
{166F1873-4CAE-4F54-88B6-5FE79678846B} = {D65A8130-6A58-4693-A96C-8C1DFA3CA355}
301+
{8BBD24E1-DE43-414A-A0F3-5B8CC125D97F} = {8FFDF555-DB50-45F9-9A2D-6410F39151C3}
302+
{FD33372B-4D2E-4F22-A866-6E01C2451FA4} = {5D11C19B-E8E4-4CE3-9C8A-1D368578EBCB}
303+
{2A39A833-558C-4054-8CEB-9293AEA38E18} = {8FFDF555-DB50-45F9-9A2D-6410F39151C3}
259304
EndGlobalSection
260305
EndGlobal

nukeeper.settings.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
22
"age": "0",
3-
"exclude": "^(Microsoft.AspNetCore.*|Microsoft.Extensions.*)"
3+
"exclude": ""
44
}

sample/Sample.Command/Program.cs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
3+
namespace Sample.Command
4+
{
5+
class Program
6+
{
7+
static void Main(string[] args)
8+
{
9+
Console.WriteLine("Hello World!");
10+
}
11+
}
12+
}

sample/Sample.Command/Sample.Command.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
<TargetFramework>netcoreapp3.1</TargetFramework>
55
</PropertyGroup>
66
<ItemGroup>
7+
<ProjectReference Include="..\..\src\Commands\Rocket.Surgery.LaunchPad.Commands.csproj" />
78
</ItemGroup>
89
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using Bogus.Extensions;
5+
using Microsoft.Data.Sqlite;
6+
using Microsoft.EntityFrameworkCore;
7+
using Microsoft.Extensions.DependencyInjection;
8+
using Rocket.Surgery.DependencyInjection;
9+
using Microsoft.Extensions.Hosting;
10+
using Rocket.Surgery.Conventions;
11+
using Rocket.Surgery.Conventions.DependencyInjection;
12+
using Sample.Core;
13+
using Sample.Core.Domain;
14+
15+
[assembly: Convention(typeof(DataGenerationConvention))]
16+
[assembly: Convention(typeof(DataConvention))]
17+
18+
namespace Sample.Core
19+
{
20+
public class DataGenerationConvention : IServiceConvention
21+
{
22+
23+
public void Register(IServiceConventionContext context)
24+
{
25+
context.Services.AddHostedService<HostedService>();
26+
}
27+
28+
class HostedService : IHostedService
29+
{
30+
private readonly IServiceProvider _serviceProvider;
31+
32+
public HostedService(IServiceProvider serviceProvider) => _serviceProvider = serviceProvider;
33+
34+
public async Task StartAsync(CancellationToken cancellationToken)
35+
{
36+
await _serviceProvider.WithScoped<RocketDbContext>().Invoke(
37+
async dbContext =>
38+
{
39+
await dbContext.Database.EnsureCreatedAsync(cancellationToken).ConfigureAwait(false);
40+
// await dbContext.Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
41+
}
42+
).ConfigureAwait(false);
43+
await _serviceProvider.WithScoped<RocketDbContext>().Invoke(
44+
async dbContext =>
45+
{
46+
var rocketFaker = new RocketFaker();
47+
var rockets = rocketFaker.GenerateBetween(10, 100);
48+
var launchFaker = new LaunchRecordFaker(rockets);
49+
50+
var launches = launchFaker.GenerateBetween(100, 1000);
51+
52+
await dbContext.Rockets.AddRangeAsync(rockets, cancellationToken).ConfigureAwait(false);
53+
await dbContext.LaunchRecords.AddRangeAsync(launches, cancellationToken).ConfigureAwait(false);
54+
await dbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
55+
}
56+
).ConfigureAwait(false);
57+
}
58+
59+
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
60+
}
61+
}
62+
63+
class DataConvention : IServiceConvention
64+
{
65+
public void Register(IServiceConventionContext context)
66+
{
67+
var connection = new SqliteConnection("DataSource=:memory:");
68+
connection.Open();
69+
context.Services
70+
.AddDbContext<RocketDbContext>(x => x
71+
.EnableDetailedErrors()
72+
.EnableSensitiveDataLogging()
73+
.EnableServiceProviderCaching()
74+
.UseSqlite(connection)
75+
);
76+
}
77+
}
78+
}
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
using System.ComponentModel.DataAnnotations;
3+
using System.ComponentModel.DataAnnotations.Schema;
4+
using System.Linq;
5+
using Microsoft.EntityFrameworkCore;
6+
using Microsoft.EntityFrameworkCore.ChangeTracking;
7+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
8+
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
9+
using Microsoft.EntityFrameworkCore.ValueGeneration;
10+
using NodaTime;
11+
using Rocket.Surgery.LaunchPad.EntityFramework;
12+
13+
namespace Sample.Core.Domain
14+
{
15+
public class LaunchRecord
16+
{
17+
public Guid Id { get; set; }
18+
19+
public string Partner { get; set; } = null!;
20+
public string Payload { get; set; } = null!;
21+
public long PayloadWeightKg { get; set; }
22+
public DateTimeOffset? ActualLaunchDate { get; set; }
23+
public DateTimeOffset ScheduledLaunchDate { get; set; }
24+
25+
public Guid RocketId { get; set; }
26+
public ReadyRocket ReadyRocket { get; set; } = null!;
27+
28+
class Configure : ConfigureEntityType<LaunchRecord>
29+
{
30+
protected override void OnEntityCreating(DbContext context, ModelBuilder modelBuilder, EntityTypeBuilder<LaunchRecord> builder)
31+
{
32+
builder.HasKey(x => x.Id);
33+
}
34+
}
35+
}
36+
}
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Microsoft.EntityFrameworkCore;
4+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
5+
using Rocket.Surgery.LaunchPad.EntityFramework;
6+
7+
namespace Sample.Core.Domain
8+
{
9+
public class ReadyRocket
10+
{
11+
public Guid Id { get; set; }
12+
public string SerialNumber { get; set; } = null!;
13+
public RocketType Type { get; set; }
14+
15+
public IEnumerable<LaunchRecord> LaunchRecords { get; set; }
16+
17+
class Configure : ConfigureEntityType<ReadyRocket>
18+
{
19+
protected override void OnEntityCreating(DbContext context, ModelBuilder modelBuilder, EntityTypeBuilder<ReadyRocket> builder)
20+
{
21+
builder.HasKey(x => x.Id);
22+
builder.ToTable("Rockets");
23+
}
24+
}
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Collections.Generic;
2+
using JetBrains.Annotations;
3+
using Microsoft.EntityFrameworkCore;
4+
using Rocket.Surgery.LaunchPad.EntityFramework;
5+
6+
namespace Sample.Core.Domain
7+
{
8+
public class RocketDbContext : LpContext<RocketDbContext>
9+
{
10+
public RocketDbContext(
11+
DbContextOptions<RocketDbContext> options,
12+
[NotNull] [ItemNotNull] IEnumerable<IOnConfiguringDbContext> configurationHandlers,
13+
[NotNull] [ItemNotNull] IEnumerable<IOnModelCreating> modelCreationHandlers
14+
) : base(options, configurationHandlers, modelCreationHandlers) { }
15+
16+
public DbSet<ReadyRocket> Rockets { get; set; } = null!;
17+
public DbSet<LaunchRecord> LaunchRecords { get; set; } = null!;
18+
}
19+
}
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace Sample.Core.Domain
2+
{
3+
public enum RocketType
4+
{
5+
Falcon9,
6+
FalconHeavy,
7+
AtlasV
8+
}
9+
}
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Bogus;
4+
using Bogus.Extensions;
5+
using Sample.Core.Domain;
6+
7+
namespace Sample.Core
8+
{
9+
class LaunchRecordFaker : Faker<LaunchRecord>
10+
{
11+
public LaunchRecordFaker(List<Sample.Core.Domain.ReadyRocket> rockets)
12+
{
13+
RuleFor(x => x.Id, x => x.Random.Guid());
14+
RuleFor(x => x.Partner, x => x.Company.CompanyName());
15+
RuleFor(x => x.ReadyRocket, x => x.PickRandom(rockets.AsEnumerable()));
16+
RuleFor(x => x.RocketId, (f, v) => v.ReadyRocket.Id);
17+
RuleFor(x => x.ActualLaunchDate, f => f.Date.PastOffset().OrNull(f, 0.2f));
18+
RuleFor(x => x.ScheduledLaunchDate, (f, v) => f.Date.PastOffset(refDate: v.ActualLaunchDate));
19+
RuleFor(x => x.PayloadWeightKg, f => f.Random.Number(100, 1000000));
20+
RuleFor(x => x.Payload, f => f.Lorem.Paragraphs(3));
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)