ุฅุญู†ุง ุนุงูŠุฒูŠู† ู†ุนู…ู„ ู†ุธุงู… ูŠุฎู„ูŠ ุงู„ู€ Customer ูŠู‚ุฏุฑ ูŠุนู…ู„ Order ูˆูŠุฏูุน ุฃูˆู†ู„ุงูŠู†. ุงู„ู†ู‡ุงุฑุฏุฉ ู‡ู†ุฑูƒุฒ ุนู„ู‰ ุชุตู…ูŠู… ุงู„ู€ Order ู†ูุณู‡.

Entities

  • ุจู…ุง ุงู†ูƒ ุดุบุงู„ Code-firstุŒ ุงู„ู…ูุฑูˆุถ ุชู‚ุฑุฃ ุงู„ู€ SRS ุงู„ุฃูˆู„ ูˆุจุนุฏูŠู† ุชุฑุณู… ุงู„ู€ Class Diagram.

  • ู‚ุจู„ ู…ุง ุชูƒุชุจ ุฃูŠ ุณุทุฑ CodeุŒ ู„ุงุฒู… ุชุนู…ู„ Design ู„ู„ู€ Service ุจุชุงุนุชูƒ ูˆุชุดูˆู ุงูŠู‡ ุงู„ู€ Entities ุงู„ู„ูŠ ู‡ุชุจู‚ุง ู…ูˆุฌูˆุฏุฉ ุนู† ุทุฑูŠู‚ Class DiagramุŒ ูˆู‡ูŠ ุฒูŠ ุงู„ู€ ERD ุจุณ ุจุชุนู…ู„ู‡ุง ู„ูˆ ุดุบุงู„ Code-first.

  • ู„ูˆ ุจุชุดุชุบู„ ู„ูˆุญุฏูƒ ู…ู…ูƒู† ุชุนู…ู„ ุงู„ู„ูŠ ูŠุนุฌุจูƒุŒ ู„ูƒู† ู„ูˆ ุญุฏ ู‡ูŠุดุชุบู„ ู…ุนุงูƒ ู„ุงุฒู… ุชุดุชุบู„ ุนู„ู‰ ุงู„ู€ Standards.

  • ุฃูŠ Module ุจุชุจุฏุฃ ุชุดุชุบู„ ููŠู‡ุŒ ุจุชุดูˆู ุงูŠู‡ ู‡ูŠ ุงู„ู€ Entities, Poco Classes, Domain Models.

Order Aggregate

  • ู‡ู†ุฑูˆุญ ุนู„ู‰ ุจุฑูˆุฌูƒุช Core ูˆู†ุนู…ู„ ููŠ ุงู„ู€ Entitles ููˆู„ุฏุฑ ู„ู„ู€ Order Aggregate.
  • ุชุตู…ูŠู…ู‡ ู…ุด ุณู‡ู„ (Complex)ุŒ ูุนุดุงู† ุชุนู…ู„ู‡ Create ู„ุงุฒู… ุชู…ุดูŠ ุนู„ู‰ Patterns ุฒูŠ ุงู„ู€ Abstract Factory Pattern and other patterns.
  • ู„ูˆ ู‡ุชุนู…ู„ Complex Object ู„ุงุฒู… ุชู…ุดูŠ ุจุจู€ Pattern ุนุดุงู† ูƒู„ ุญุงุฌุฉ ุชุจู‚ุง ุชู…ุงู… ุฒูŠ ุงู„ู€ Abstract Factory ุฃูˆ ุงู„ู€ Builder Design Pattern.

Address

ู‡ุนู…ู„ Address ุงู„ู„ูŠ ู‡ุดุญู† ุนู„ูŠู‡ ุงู„ู€ Order:

public class Address
{
	public string FirstName {get; set;}
	public string LName {get; set;}
	public string Street {get; set;}
	public string City {get; set;}
	public string Country {get; set;}
}
  • ู‡ุชู‚ูˆู„ูŠ ู…ุง ุงุญู†ุง ูƒู†ุง ุนุงู…ู„ูŠู† Address ููŠ ุงู„ู€ Identity ุจุณ ุฏุง ูƒุงู† ุจุชุงุน ุงู„ู€ User ูˆุฏุง Table ููŠ ุงู„ู€ Database. ุงู†ู…ุง ุฏุง ุจูŠู…ุซู„ ุงู„ู€ Address ุจุชุงุน ุงู„ู€ Order.
  • ู…ุด ู‡ุฎู„ูŠู‡ ูŠูˆุฑุซ ู…ู† ุงู„ู€ BaseEntity ู„ุฃู†ูŠ ู…ุด ู‡ุญูˆู„ู‡ ู„ู€ Table.
  • ุงู„ุนู„ุงู‚ุฉ ุจูŠู† ุงู„ู€ Address ูˆุงู„ู€ Order ู‡ูŠ One-to-one ูˆูƒู…ุงู† ุงู„ุงุชู†ูŠู† ู„ุงุฒู… ูŠุดุงุฑูƒูˆุง ูุงู„ู…ูุฑูˆุถ ุงู„ุฅุชู†ูŠู† ุจูŠุชุญุทูˆุง ู Table ูˆุงุญุฏ ุนุดุงู† ูƒุฏุง ู…ุด ู‡ุนู…ู„ ู„ุฏุง Table ูŠุนู†ูŠ ู…ู† ุงู„ุขุฎุฑ ู‡ูŠุชุญุท ู…ุน ุงู„ู€ Order.
  • ุงู„ู€ Address ุฏุง ู‡ูŠูŠุฌูŠ ู…ู† ุนู†ูˆุงู† ุงู„ู€ User ู†ูุณู‡ ุฃูˆู„ ู…ุง ูŠูŠุฌูŠ ูŠุนู…ู„ Order ูˆุฃุญุทู‡ ู…ุน ุงู„ู€ Order ุจุณ ุนู„ู‰ ู‡ูŠุฆุฉ ุงู„ู€ Address ุฏุง ูˆู‡ุฏูŠู„ู‡ ุงู…ูƒุงู†ูŠุฉ ุงู†ู‡ ูŠู‚ุฏุฑ ูŠุบูŠุฑ ููŠู‡. ูŠุนู†ูŠ ุงู„ู€ Address ุจุชุงุน ุงู„ู€ User ู‡ูˆ ุงู„ู€ Default Address for Order.
  • ูŠุนู†ูŠ ุฃู†ุง ู…ู…ูƒู† ุฃุจุนุช ุนู„ู‰ ู†ูุณ ุงู„ู€ Address ุจุชุงุน ุงู„ู€ User ุฃูƒุชุฑ ู…ู† Order ุจุณ ุงู„ู€ Address ุจุชุงุน ุงู„ู€ Order ู„ุงุฒู… ูŠุจู‚ุง ูˆุงุญุฏ ุจุณ ูˆู…ู…ูƒู† ูŠุจู‚ุง ู‡ูˆ ู‡ูˆ ุจุชุงุน ุงู„ู€ User.

Delivery method

ู‡ูŠุจู‚ุง ุนุจุงุฑุฉ ุนู† Table ูู‡ูŠูˆุฑุซ ู…ู† ุงู„ู€ BaseEntity:

public class DeliveryMethod : BaseEntity
{
	public string ShortName {get; set;}
	public string Description {get; set;}
	public decimal Cost {get; set;}
	public string DeliveryTime {get; set;}
}

Order Status : Enum

public enum OrderStatus
{
	[EnumMember(Value = "Pending")]
	Pending, // label
	[EnumMember(Value = "Payment Buy")]
	PaymentReveived,
	[EnumMember(Value = "Payment Faild")]
	PaymentFailed
}
  • ุงู†ุง ุนุงูŠุฒุฉ ูŠุชุฎุฒู† ููŠ ุงู„ู€ Database ู…ุด ุฑู‚ู… ุฃู†ุง ุนุงูŠุฒุฉ ูŠุชุฎุฒู† ูƒูƒู„ู…ุฉ.
  • ูู‡ุณุชุฎุฏู… Attribute ุงุณู…ู‡ EnumMember ูˆุฏุง ู‡ูŠุฎุฒู†ู‡ ููŠ ุงู„ู€ Database ูƒู€ String. ุงุชูƒู„ู…ู†ุง ู‚ุจู„ ูƒุฏุง ุนู† ุงู„ู€ Cs Enums.

Items

  • ู‡ูŠุจู‚ุง ุนุจุงุฑุฉ ุนู† Table ูู‡ูŠูˆุฑุซ ู…ู† ุงู„ู€ BaseEntity.
  • ุงู„ุนู„ุงู‚ุฉ ุจูŠู†ู‡ ูˆุจูŠู† ุงู„ู€ Order ุงู†ู‡ One-to-Many ู…ู† ู†ุงุญูŠุฉ ุงู„ู€ Order:
public class OrderItem : BaseEntity
{
	public int ProductId {get; set;}
	public string ProductName {get; set;}
	public string PictureUrl {get; set;}
	public decimal Price {get; set;}
	public int Qunatity {get; set;}
}
  • ููŠู‡ ูุฑู‚ ุจูŠู† ุงู„ู€ ProductId ูˆุงู„ู€ Id ุงู„ู„ูŠ ู‡ูŠูˆุฑุซู‡ ู…ู† ุงู„ู€ BaseEntity.
    • ุงู„ู€ ProductId ุฏุง ุจุชุงุน ุงู„ู€ Product ู†ูุณู‡
    • ุงู†ู…ุง ุงู„ุชุงู†ูŠ ุนุจุงุฑุฉ ุนู† ุงู„ู€ Primary key ุจุชุงุน ุงู„ุฌุฏูˆู„.
    • ุงู†ุง ู…ุซู„ู‹ุง ุฑูˆุญุช ุณุชุงุฑ ุจูƒุฑ ูˆุทู„ุจุช ุฃูŠุณ ู…ูˆูƒุง ูˆููŠู‡ Id ู„ู‡ ูุฃู†ุง ุนู…ู„ุช Order ูุงู„ู€ Order ุจุชุงุนูŠ ุฏุง ููŠู‡ Item ูˆุงุญุฏ ุจุณ ูˆุฏุง Record in table orderItems ูุฃูƒูŠุฏ ู„ู‡ ุงู„ู€ Id ุจุชุงุนู‡ ู‡ูˆ ู…ุด ุจุชุงุน ุงู„ุญุงุฌุฉ ุงู„ู„ูŠ ุจุชุทู„ุจ.

ู…ู† ุถู…ู† ู‚ูˆุงุนุฏ ุงู„ู€ Clean Code: ู„ูˆ ุนู†ุฏูƒ ู…ุฌู…ูˆุนุฉ ู…ู† ุงู„ู€ Properties ูƒู„ู‡ู… ุจูŠู…ุซู„ูˆุง ู†ูุณ ุงู„ุญุงุฌุฉ ูˆูŠู†ูุน ุชุนู…ู„ู‡ู… Encapsulation ููŠ Type ูˆุงุญุฏ ูˆู„ู…ุง ุชุนู…ู„ ูƒุฏุง ู‡ูŠุจู‚ุง ู„ูŠู‡ุง MeaningุŒ ุงุนู…ู„ ูƒุฏุง.

ููุงู„ู…ุซุงู„ ุงู„ู„ูŠ ููˆู‚ ุฏุง ุนู†ุฏู†ุง ุงู„ู€ ProductId, ProductName, PictureUrl ูƒู„ู‡ู… ุจูŠุนุจุฑูˆุง ุนู† ุงู„ู€ Product ุงู„ู„ูŠ ู‡ูŠุชุทู„ุจ. ู„ูŠู‡ ู…ุฏุฎู„ู†ุงุด ุงู„ู€ Price ู„ุฃู† ุฏุง ู…ุด ุดุฑุท ูŠุจู‚ุง ุณุนุฑ ุงู„ู€ Product ุงู†ู…ุง ุฏุง ุณุนุฑ ุงู„ู€ Item ููŠ ุงู„ู€ Order. ุจู…ุนู†ู‰ ุงู† ู…ู…ูƒู† ูŠุญุตู„ ู…ุซู„ู‹ุง Discount ููŠู†ุฒู„ ุฃูˆ ูƒุฏุง.

// In another file
public class ProductItemOrdered
{
	public int ProductId {get; set;}
	public string ProductName {get; set;}
	public string PictureUrl {get; set;}
}
 
public class OrderItem : BaseEntity
{
	public ProductItemOrdered Product {get; set;}
	public decimal Price {get; set;}
	public int Qunatity {get; set;}
}
  • ุจุณ ุฏุง ู…ุด ู‡ูŠุจู‚ุง Table ู„ุฃู† ุงู„ุนู„ุงู‚ุฉ ุนุจุงุฑุฉ ุนู† One-to-one.
  • ูุฃู†ุง ู‡ุนู…ู„ Mapping ู„ู„ุงุชู†ูŠู† ุฏูˆู„ ููŠ ุฌุฏูˆู„ ูˆุงุญุฏ ุฒูŠ ู…ุง ู‡ู†ุนู…ู„ ููŠ ุงู„ู€ Order ูˆุงู„ู€ Address.
  • ุงู„ุญูŠุงุฉ ููŠ ุงู„ู€ Database ู…ุฎุชู„ูุฉ ุนู† ุงู„ู€ Code ู„ุฃู† ู…ุซู„ู‹ุง ููŠ ุงู„ู€ Database ูƒู†ุง ู‚ูˆู„ู†ุง ู‡ูŠุจู‚ูˆุง ููŠ ุฌุฏูˆู„ ูˆุงุญุฏ.
  • ุงู†ู…ุง ููŠ ุงู„ูƒูˆุฏ ู‡ุฑูˆุญ ุฃุนู…ู„ Order ูˆู‡ูŠุจู‚ุง ุฌูˆุงู‡ Items ูˆุฌูˆุง ุงู„ู€ Items ููŠู‡ ProductItemOrdered ูˆุฌูˆุงู‡ ุงู„ู…ุนู„ูˆู…ุงุช ุจุชุงุน ุงู„ู€ Order ุจู‚ุง.

Order : Main

ู‡ูŠุจู‚ุง ุนุจุงุฑุฉ ุนู† Table ูู‡ูŠูˆุฑุซ ู…ู† ุงู„ู€ BaseEntity:

public class Order : BaseEntity
{
	public string BuyerEmail {get; set;}
	public DateTimeOffset OrderDate {get; set;} = DateTimeOffset.UtcNow;
	public OrderStatus Status {get; set;} = OrderStatus.Pending;
	public Address ShippingAddress {get; set;} 
	// Not navigational Property
	// public int DeliveryMethodId {get; set;} // FK
	public DeliveryMethod DeliveryMethod {get; set;}
	// Navigational Property [One]
	public ICollection<OrderItem> Items {get; set;} = new HashSet<OrderItem>();
	// Navigational Property [Many]
	public decimal Subtotal {get; set;} // Cost without delivery
	[NotMapped]
	public decimal Total {get {return Subtotal + DeliveryMethod.Cost};}
	//Or
	public decimal Total => Subtotal + DeliveryMethod.Cost;
 
	// Second Way
	public decimal GetTotal()
		=> Subtotal + DeliveryMethod.Cost;
	// Derived Attribute
 
	public string PymentIntentId {get; set;} = string.Empty;
}
  • ู„ูŠู‡ DatTimeOffsetุŸ ุนุดุงู† ู…ูŠุธู‡ุฑุด Local ูˆู„ูˆ ุฑุงุญ ุจู„ุฏ ุชุงู†ูŠุฉ ุฏุง ู…ูŠุนู…ู„ุด ู…ุดุงูƒู„.
  • ุงู„ู€ Address ู…ุด ู‡ูŠุจู‚ุง Navigational Property ุนุดุงู† ู‡ูˆ ุจูŠุจู‚ุง ููŠ ู†ูุณ ุงู„ู€ Table.

  • ู…ู…ูƒู† ุฃุณุชุฎุฏู… ุงู„ู€ Delivery Method ุนุดุงู† ูŠูˆุตู„ ุงูƒุชุฑ ู…ู† Order ุจุณ ุงู„ู€ Order ุจู†ุณุชุฎุฏู… ุนุดุงู† ู†ูˆุตู„ู‡ Delivery Method ูˆุงุญุฏุฉ.

  • ู‡ุญุชุงุฌ ุฃุฑูˆุญ ููŠ ุงู„ู€ Delivery Method ุฃุนู…ู„ Navigational Property(Many) ุจุณ ุงู†ุง ู…ุด ู…ุญุชุงุฌ ุฃุนู…ู„ู‡ุง ุญุงู„ูŠู‹ุง ุนุดุงู† ู…ุด ู‡ุณุชุฎุฏู…ู‡ุง ูู‡ูˆ ู‡ูŠูู‡ู… ุงู† ู‡ูŠ One-to-One ูู‡ูˆ ู‡ูŠุฑูˆุญ ูŠุงุฎุฏ ุงู„ู€ May(Delivery Method) ูŠุญุทู‡ุง ููŠ ุงู„ู€ Must (Order). ู‡ูˆ ุนุฑู ู…ู†ูŠู†ุŸ ุนุฑู ุนู† ุทุฑูŠู‚ ุงู† ุงู„ู€ Order ููŠู‡ Delivery Method ูุฏุง ู„ุงุฒู… ูŠุดุงุฑูƒ ููŠ ุงู„ุนู„ุงู‚ุฉ ุงู†ู…ุง ุงู„ู†ุงุญูŠุฉ ุงู„ุชุงู†ูŠุฉ ู…ููŠุด ูุฏุง ุนุงุฏูŠ ู…ูŠุดุงุฑูƒุด ุงูˆ ูƒุฏุง. ูู‡ุญุชุงุฌ ุฃุนู…ู„ ุงู„ู€ Foreign Key.

  • ู„ูˆ ุฌูŠุช ุฃุนู…ู„ Order ูˆุญุทูŠุช ุงู„ู€ DeliveyMethodId ุจู€ 1 ูˆุฌู‡ ู…ุซู„ู‹ุง ุจูˆุจ ูˆุนู…ู„ ุงูˆุฑุฏุฑ ูˆุญุท ุงู„ู€ DeliveyMethodId ุจู€ 1ุŒ ุญุฏ ู‡ูŠุนุชุฑุถุŸ ุงูƒูŠุฏ ู„ุง ูŠุจู‚ุง ุฒูŠ ู…ุง ู‡ูŠ ูƒุฏุง ุชุนุชุจุฑ one-to-many ู…ุด one-to-one.
  • ูƒู„ ุงู„ุนู„ุงู‚ุงุช ุฃุตู„ู‹ุง ุจูŠุชุนู…ู„ู‡ุง Map ู„ู€ One-to-many ูˆุฏุง ุงู„ุทุจูŠุนูŠ ูƒูƒู„ ุฅู†ู…ุง ู„ูˆ ุนุงูŠุฒู‡ุง ุชุจู‚ุง one-to-one ูุนู„ู‹ุง ู„ุงุฒู… ุฃุญุท Constraint ูˆูŠูƒูˆู† Unique ุจุงู„ู€ Fluent API.

  • ุจุณ ุฃู†ุง ู…ุด ู…ุญุชุงุฌ ุฃุนู…ู„ Property ุจุชู…ุซู„ ุงู„ู€ Foreign KeyุŒ ูˆู‡ูˆ ุจุฑุงุญุชูƒ. ู„ุฃู†ูŠ ู…ู…ูƒู† ุฃุณุชุฎุฏู… ุงู„ู€ Navigational Property.
  • ุงุฒุงูŠ ุฃุนู…ู„ Set ู„ู„ู€ Foreign KeyุŸ ุนู† ุทุฑูŠู‚ ุงู„ู€ Navigational Property ุจุดุฑุท ุฅู† ุงู„ู€DeleviryMethod ุชูƒูˆู† ู‡ูŠ ุงู„ู„ูŠ ุฌุงูŠุฉ ู…ู† ุงู„ู€ DB ูˆุงู„ู€ EF Core ุนุงู…ู„ู‡ุง Tracking.

ุงู„ู€ Derived attribute ู„ู‡ ุทุฑูŠู‚ุชูŠู†:

  • ุงู…ุง ุฅู†ูŠ ุฃุนู…ู„ู‡ Readonly ุจูŠุงุฎุฏ get ุจุณ ูˆุงุนู…ู„ ุงู„ู€ get ุฏูŠ ุงู„ู…ุนุงุฏู„ุฉ ุจุชุงุนุชู‡ ูˆุงุนู…ู„ู‡ุง NotMapped.
  • ุงู„ุทุฑูŠู‚ุฉ ุงู„ุชุงู†ูŠุฉ ุฃุนู…ู„ Function ุจุชุนู…ู„ Get ุจุณ (ุงู„ู…ูุถู„ุฉ).

ู„ูˆ ุญุฏ ู‚ุงู„ูƒ ุฅู† ุงู„ู…ูุฑูˆุถ ุงู„ู€ Entity ูŠุจู‚ุง Poco class ูˆู…ุด ุจูŠุจู‚ุง ููŠู‡ุง ุฃูŠ Functionality ุฃูˆ ุฃูŠ Behaviour ุชู‚ูˆู„ู‡ ุฏูŠ ู…ุด Functionality ุฏูŠ ุนุจุงุฑุฉ ุนู† Derived Attribute.


  • ุงู„ู€ Property ุงู„ุฃุฎูŠุฑุฉ ุฏูŠ ุจุชุงุน ุงู„ู€ Intent ุนุดุงู† ู‡ุณุชุฎุฏู…ู‡ุง ููŠ ุงู„ุณูŠุดู† ุงู„ุฌุงูŠุฉ.
  • ุนุดุงู† ู…ุถุทุฑุด ุฃุนู…ู„ Migration ุชุงู†ูŠ ูู‡ุนู…ู„ู‡ุง ุจุณ ูƒุฏุง ู‡ุถุทุฑ ุฃุฎุฒู†ู‡ุง ุจุฑุถูˆ ูˆุฏูŠ ู…ุดูƒู„ุฉ ูู‡ุถุทุฑ ุฃู‚ูˆู„ ุงู†ู‡ุง ุจุชู‚ุจู„ Null ุจุณ ุจุฑุถูˆ ู‡ุถุทุฑ ุฃุบูŠุฑู‡ุง ูˆุงู‚ูˆู„ ุงู†ู‡ุง ู…ุจุชู‚ุจู„ุด Null ุจุนุฏ ูƒุฏุง ูู‡ุนู…ู„ Migration ูู„ุงุฒู… ุฃุฏูŠู„ู‡ุง Default value ูˆู‡ูŠ ุนุจุงุฑุฉ ุนู† Empty string ูˆุงู„ุณูŠุดู† ุงู„ุฌุงูŠุฉ ุฃุดูŠู„ู‡ุง.

Constructor

  • ู…ุญุชุงุฌ ุฃุนู…ู„ Constructors ู„ูƒู„ ุงู„ู€ Classes ุฏูŠ ูˆุชูƒูˆู† ุจุชุงุฎุฏ ู‚ูŠู… ู„ูƒู„ ุญุงุฌุฉ ูˆุจุญุทู‡ุง ููŠู‡ุง. ูุฃู†ุง ุจู‚ู ุนู„ู‰ ุงู„ู€ Class ูˆุงุนู…ู„ Generate constructor ูˆู†ุญุฏุฏ ูƒู„ู‡ ูˆู†ุนู…ู„ู‡.

  • ุจุณ ุงู„ู…ุดูƒู„ุฉ ุฅู† ุงู„ู€ EF Core ุจูŠุญุชุงุฌ Ctor ูุงุถูŠ ู„ูƒู„ ุงู„ู€ Tables ุงูˆ ุงู„ู€ Entities ุงู„ู„ูŠ ุฌูˆุง Tables ุนุดุงู† ูŠู‚ุฏุฑ ูŠุณุชุฎุฏู…ู‡. ูุฃู†ุง ู…ุถุทุฑ ุฅู†ูŠ ุงุนู…ู„ู‡ ุงู†ุง ู„ุฃู†ูŠ ุจุนุฏ ู…ุง ุนู…ู„ุช ูˆุงุญุฏ ู…ุด ูุงุถูŠ ุงู„ู„ูŠ ูƒุงู† ูุงุถูŠ ุงุชู…ุณุญ.

ุจุณ ุฎุฏ ุจุงู„ูƒ ู…ู† ุงู„ุญุงุฌุงุช ุงู„ุซุงุจุชุฉ ู…ุชุญุทู‡ุง ููŠ ุงู„ู€ Ctor. ู…ุซู„ู‹ุง ุฏุง ู„ู„ู€ Order.