public static User ToUser(this UserState state) => User.From( EntityId.From(state.Id), Name.From(state.Name), SocialSecurityId.From(state.Cnpj), Email.From(state.CommercialEmail), Version.From(BitConverter.ToInt32(state.RowVersion)));
public static Project ToProject(this ProjectState state) => Project.From( EntityId.From(state.Id), ProjectName.From(state.Name), ProjectCode.From(state.Code), DateAndTime.From(state.StartDate), Money.From(state.Budget), EntityId.From(state.ClientId), Email.From(state.Owner), ProjectStatus.From(state.Status), ServiceOrderNumber.From(state.OrderNumber), Version.From(BitConverter.ToInt32(state.RowVersion)));
public void user_aggregate_reconstruct() { var fixture = new Fixture(); fixture.Register <EntityId>(() => EntityId.From(fixture.Create <Guid>())); fixture.Register <Version>(() => Version.From(fixture.Create <int>())); fixture.Register <Name>(() => Name.From(fixture.Create <string>())); fixture.Register <SocialSecurityId>(() => SocialSecurityId.From(fixture.Create <string>())); fixture.Register <Email>(() => Email.From(string.Format($"{fixture.Create<string>()}@teste.com"))); fixture.Register <User>(() => User.From(fixture.Create <EntityId>(), fixture.Create <Name>(), fixture.Create <SocialSecurityId>(), fixture.Create <Email>(), fixture.Create <Version>())); fixture.Register <UserAggregationRoot>( () => UserAggregationRoot.ReconstructFrom(fixture.Create <User>())); var agg = fixture.Create <UserAggregationRoot>(); Assert.True(agg.ValidationResults.IsValid); }
// https://docs.microsoft.com/en-us/ef/core/saving/disconnected-entities public void Add(Project entity) { var entry = entity.ToProjectState(); var oldState = DbContext.Projects .OrderByDescending(ob => ob.Id) .ThenByDescending(ob => ob.RowVersion) .FirstOrDefault(t => t.Id == entity.Id.Value); if (oldState == null) { DbContext.Projects.Add(entry); } else { var version = Version.From(BitConverter.ToInt32(oldState.RowVersion)); if (Version.Next(version) > entity.Version) { throw new DbUpdateConcurrencyException("This version is not the most updated for this object."); } DbContext.Entry(oldState).CurrentValues.SetValues(entry); } }
public void user_add_command_succed() { var fixture = new Fixture().Customize(new AutoNSubstituteCustomization { ConfigureMembers = true }); fixture.Register <EntityId>(() => EntityId.From(fixture.Create <Guid>())); fixture.Register <Name>(() => Name.From(fixture.Create <string>())); fixture.Register <Version>(() => Version.From(fixture.Create <int>())); fixture.Register <SocialSecurityId>(() => SocialSecurityId.From(fixture.Create <string>())); fixture.Register <Email>(() => Email.From(string.Format($"{fixture.Create<string>()}@teste.com"))); fixture.Register <User>(() => User.From(fixture.Create <EntityId>(), fixture.Create <Name>(), fixture.Create <SocialSecurityId>(), fixture.Create <Email>(), fixture.Create <Version>())); var finalUser = fixture.Create <User>(); var command = fixture.Build <AddUserCommand>() .With(user => user.CommercialEmail, finalUser.CommercialEmail.Value) .With(user => user.Cnpj, finalUser.Cnpj.Value) .With(user => user.Name, finalUser.Name.Value) .Create(); var mediator = fixture.Create <IMediator>(); var logger = fixture.Create <ILogger <AddUserCommandHandler> >(); var db = fixture.Create <IDbSession <IUserRepository> >(); var handler = new AddUserCommandHandler(logger, mediator, db); var result = handler.Execute(command); db.Received().Repository.Add(finalUser); db.Received().SaveChanges(); mediator.Received(1).Publish(Arg.Any <UserAddedEvent>()); Assert.True(result.IsSucceed); }