diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs index 5579cf45e..9576940df 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() { } @@ -30,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; diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs index ae2194948..661965c5c 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; @@ -177,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 823019d13..11b940218 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,14 @@ } } - public List DomainEvents => _domainEvents; + 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 +71,6 @@ return base.GetHashCode(); } - public static bool operator ==(Entity left, Entity right) { if (Object.Equals(left, null)) 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() 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..a2cfb96a5 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();