From 1b5186534917b4faef070fc3582a62eb1614f24b Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 10:35:08 -0800 Subject: [PATCH 1/7] Minor refactoring at Seedwork --- src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs index 823019d13..9b68af850 100644 --- a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs +++ b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs @@ -6,12 +6,8 @@ public abstract class Entity { - int? _requestedHashCode; - int _Id; - - private List _domainEvents; - + int _Id; public virtual int Id { get @@ -24,13 +20,13 @@ } } + private List _domainEvents; public List DomainEvents => _domainEvents; public void AddDomainEvent(INotification eventItem) { _domainEvents = _domainEvents ?? new List(); _domainEvents.Add(eventItem); } - public void RemoveDomainEvent(INotification eventItem) { if (_domainEvents is null) return; @@ -74,7 +70,6 @@ return base.GetHashCode(); } - public static bool operator ==(Entity left, Entity right) { if (Object.Equals(left, null)) From 0ca2faaaab84c7a6c2db773abc11257e63cdf32e Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 10:49:18 -0800 Subject: [PATCH 2/7] Removing unneeded blank lines on the ValueObject class --- src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs b/src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs index 40e587683..40fb117e1 100644 --- a/src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs +++ b/src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs @@ -14,16 +14,13 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork return ReferenceEquals(left, null) || left.Equals(right); } - protected static bool NotEqualOperator(ValueObject left, ValueObject right) { return !(EqualOperator(left, right)); } - protected abstract IEnumerable GetAtomicValues(); - public override bool Equals(object obj) { if (obj == null || obj.GetType() != GetType()) @@ -47,7 +44,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork return !thisValues.MoveNext() && !otherValues.MoveNext(); } - public override int GetHashCode() { return GetAtomicValues() From 18af108cd6455ab4f5b9b5595a60e519be1774d7 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 10:51:35 -0800 Subject: [PATCH 3/7] Cleaning up the Address ValueObject class --- .../AggregatesModel/OrderAggregate/Address.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs index 5579cf45e..c64874a02 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs @@ -4,17 +4,12 @@ using System.Collections.Generic; namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate { - public class Address - :ValueObject + public class Address : ValueObject { public String Street { get; private set; } - public String City { get; private set; } - public String State { get; private set; } - public String Country { get; private set; } - public String ZipCode { get; private set; } private Address() { } From 16ee5631123b4ae7eb82bf4554544682f219403e Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 10:56:46 -0800 Subject: [PATCH 4/7] Cleaning up the Address ValueObject --- .../Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs index c64874a02..9576940df 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs @@ -25,6 +25,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O protected override IEnumerable GetAtomicValues() { + // Using a yield return statement to return each element one at a time yield return Street; yield return City; yield return State; From 625f53213bc48b6ba75f3e56c13f9d45e8c3fd46 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 12:45:05 -0800 Subject: [PATCH 5/7] Added a comment about Addess as Value Object and EF Core 2.0 onwed entity --- .../Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs index ae2194948..9b5216392 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs @@ -15,6 +15,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O // aligned with DDD Aggregates and Domain Entities (Instead of properties and property collections) private DateTime _orderDate; + // Address is a Value Object pattern example persisted as EF Core 2.0 owned entity public Address Address { get; private set; } private int? _buyerId; From a88fbf339fac8fd6a125fa1b460b3ca19ece5619 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 16:15:03 -0800 Subject: [PATCH 6/7] Minor clean-up in Ordering Context --- .../OrderEntityTypeConfiguration.cs | 6 +++--- .../Ordering.Infrastructure/OrderingContext.cs | 11 +---------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/Services/Ordering/Ordering.Infrastructure/EntityConfigurations/OrderEntityTypeConfiguration.cs b/src/Services/Ordering/Ordering.Infrastructure/EntityConfigurations/OrderEntityTypeConfiguration.cs index 19684d5e3..d4eb1fb9a 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/EntityConfigurations/OrderEntityTypeConfiguration.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/EntityConfigurations/OrderEntityTypeConfiguration.cs @@ -7,8 +7,7 @@ using System; namespace Ordering.Infrastructure.EntityConfigurations { - class OrderEntityTypeConfiguration - : IEntityTypeConfiguration + class OrderEntityTypeConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder orderConfiguration) { @@ -21,6 +20,7 @@ namespace Ordering.Infrastructure.EntityConfigurations orderConfiguration.Property(o => o.Id) .ForSqlServerUseSequenceHiLo("orderseq", OrderingContext.DEFAULT_SCHEMA); + //Address value object persisted as owned entity type supported since EF Core 2.0 orderConfiguration.OwnsOne(o => o.Address); orderConfiguration.Property("OrderDate").IsRequired(); @@ -32,7 +32,7 @@ namespace Ordering.Infrastructure.EntityConfigurations var navigation = orderConfiguration.Metadata.FindNavigation(nameof(Order.OrderItems)); // DDD Patterns comment: - //Set as Field (New since EF 1.1) to access the OrderItem collection property through its field + //Set as field (New since EF 1.1) to access the OrderItem collection property through its field navigation.SetPropertyAccessMode(PropertyAccessMode.Field); orderConfiguration.HasOne() diff --git a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs index b91f441ba..1855b268a 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs @@ -12,22 +12,14 @@ using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure { - public class OrderingContext - : DbContext,IUnitOfWork - + public class OrderingContext : DbContext,IUnitOfWork { public const string DEFAULT_SCHEMA = "ordering"; - public DbSet Orders { get; set; } - public DbSet OrderItems { get; set; } - public DbSet Payments { get; set; } - public DbSet Buyers { get; set; } - public DbSet CardTypes { get; set; } - public DbSet OrderStatus { get; set; } private readonly IMediator _mediator; @@ -63,7 +55,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure // You will need to handle eventual consistency and compensatory actions in case of failures in any of the Handlers. await _mediator.DispatchDomainEventsAsync(this); - // After executing this line all the changes (from the Command Handler and Domain Event Handlers) // performed throught the DbContext will be commited var result = await base.SaveChangesAsync(); From d2f7d6a5d6d9cc90caf9f7c6503bec459115c7af Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 16:53:41 -0800 Subject: [PATCH 7/7] Minor clean-up on Entity, Domain Events. --- .../AggregatesModel/OrderAggregate/Order.cs | 8 ++++---- .../Ordering.Domain/Events/OrderStartedDomainEvent.cs | 9 ++++----- src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs | 3 ++- .../Ordering/Ordering.Infrastructure/OrderingContext.cs | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs index 9b5216392..661965c5c 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs @@ -178,16 +178,16 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O private void AddOrderStartedDomainEvent(string userId, int cardTypeId, string cardNumber, string cardSecurityNumber, string cardHolderName, DateTime cardExpiration) { - var orderStartedDomainEvent = new OrderStartedDomainEvent( - this, userId, cardTypeId, cardNumber, cardSecurityNumber, - cardHolderName, cardExpiration); + var orderStartedDomainEvent = new OrderStartedDomainEvent(this, userId, cardTypeId, + cardNumber, cardSecurityNumber, + cardHolderName, cardExpiration); this.AddDomainEvent(orderStartedDomainEvent); } private void StatusChangeException(OrderStatus orderStatusToChange) { - throw new OrderingDomainException($"Not possible to change order status from {OrderStatus.Name} to {orderStatusToChange.Name}."); + throw new OrderingDomainException($"Is not possible to change the order status from {OrderStatus.Name} to {orderStatusToChange.Name}."); } public decimal GetTotal() diff --git a/src/Services/Ordering/Ordering.Domain/Events/OrderStartedDomainEvent.cs b/src/Services/Ordering/Ordering.Domain/Events/OrderStartedDomainEvent.cs index 38de4601a..a457067f6 100644 --- a/src/Services/Ordering/Ordering.Domain/Events/OrderStartedDomainEvent.cs +++ b/src/Services/Ordering/Ordering.Domain/Events/OrderStartedDomainEvent.cs @@ -9,8 +9,7 @@ namespace Ordering.Domain.Events /// /// Event used when an order is created /// - public class OrderStartedDomainEvent - : INotification + public class OrderStartedDomainEvent : INotification { public string UserId { get; private set; } public int CardTypeId { get; private set; } @@ -21,9 +20,9 @@ namespace Ordering.Domain.Events public Order Order { get; private set; } public OrderStartedDomainEvent(Order order, string userId, - int cardTypeId, string cardNumber, - string cardSecurityNumber, string cardHolderName, - DateTime cardExpiration) + int cardTypeId, string cardNumber, + string cardSecurityNumber, string cardHolderName, + DateTime cardExpiration) { Order = order; UserId = userId; diff --git a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs index 9b68af850..11b940218 100644 --- a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs +++ b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs @@ -21,7 +21,8 @@ } private List _domainEvents; - public List DomainEvents => _domainEvents; + public List DomainEvents => _domainEvents; + public void AddDomainEvent(INotification eventItem) { _domainEvents = _domainEvents ?? new List(); diff --git a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs index 1855b268a..a2cfb96a5 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure { - public class OrderingContext : DbContext,IUnitOfWork + public class OrderingContext : DbContext, IUnitOfWork { public const string DEFAULT_SCHEMA = "ordering"; public DbSet Orders { get; set; }