不使用 ORM 持久化 Order AggregateRoot
Persisting Order AggregateRoot Without Using ORM
我有一个聚合根 Order 及其子聚合 OrderLine,我试图在不使用 ORM 框架的情况下实现存储库模式,仅 ADO.Net,说实话,我的大脑堆栈有点溢出。
我学到的一种方法是使用 Projac,它的想法是在聚合根中记录事件,然后使用它们将更改保存到数据库。现在我试图避免将 Projac 与 events 一起使用,并希望实现将检测 AggregateRoot 内的更改并将它们保存到数据库的存储库。有没有不使用 ORM 的最佳实践?我真的找不到任何东西,我看到的所有示例都使用 EF 或 Nhibernate,或其他 ORM。
谢谢。
订单聚合根:
// Skipped most of properties
public class Order
{
public int OrderID { get; private set; }
public bool IsFinalized { get; private set; }
public List<OrderLine> OrderLines { get; private set; }
public void FinalizeOrder()
{
IsFinalized = true;
}
public void AddOrderLine(int stockItemID)
{
var orderLine = new OrderLine(0, OrderID, stockItemID);
OrderLines.Add(orderLine);
}
}
订单行汇总:
// Skipped most of properties
public class OrderLine
{
public OrderLine(int orderLineID, int orderID, int stockItemID)
{
OrderLineID = orderLineID;
OrderID = orderID;
StockItemID = stockItemID;
}
public int OrderLineID { get; private set; }
public int OrderID { get; private set; }
public int StockItemID { get; private set; }
}
OrderCommanHandler 和命令:
public class OrderCommandsHandler :
ICommandHandler<FinalizeOrderCommand>,
ICommandHandler<AddOrderLineCommand>
{
private readonly IOrderRepository orderRepository;
public OrderCommandsHandler(IOrderRepository orderRepository)
{
this.orderRepository = orderRepository;
}
public void Handle(AddOrderLineCommand command)
{
var order = orderRepository.FindByID(command.OrderID);
order.AddOrderLine(command.StockItemID);
orderRepository.Save(order);
}
public void Handle(FinalizeOrderCommand command)
{
var order = orderRepository.FindByID(command.OrderID);
order.FinalizeOrder();
orderRepository.Save(order);
}
}
public class AddOrderLineCommand : ICommand
{
public AddOrderLineCommand(int orderID, int stockItemID)
{
OrderID = orderID;
StockItemID = stockItemID;
}
public int OrderID { get; private set; }
public int StockItemID { get; private set; }
}
public class FinalizeOrderCommand : ICommand
{
public FinalizeOrderCommand(int orderID)
{
OrderID = orderID;
}
public int OrderID { get; private set; }
}
和 OrderRepository:
public class OrderRepository : IOrderRepository
{
public Order FindByID(int id)
{
// This is simple
throw new NotImplementedException();
}
public void Save(Order order)
{
// Help me implement
throw new NotImplementedException();
}
}
Is there any best practice to do it without using ORM? I really couldn't find anything, all example that i have seen are using EF or Nhibernate, or other ORMs.
这实际上与 CQRS、聚合或域驱动设计无关。只是"how do I save an object to a database"。我建议研究微型 ORM,例如 PetaPoco 或 Dapper。这些为您提供了一个非常轻量级的抽象来使用,并且有大量关于如何将对象保存到数据库的示例。它们有点介于使用 ADO.net 和成熟的 ORM(例如 nHibernate 或 EntityFramework)之间。
我有一个聚合根 Order 及其子聚合 OrderLine,我试图在不使用 ORM 框架的情况下实现存储库模式,仅 ADO.Net,说实话,我的大脑堆栈有点溢出。
我学到的一种方法是使用 Projac,它的想法是在聚合根中记录事件,然后使用它们将更改保存到数据库。现在我试图避免将 Projac 与 events 一起使用,并希望实现将检测 AggregateRoot 内的更改并将它们保存到数据库的存储库。有没有不使用 ORM 的最佳实践?我真的找不到任何东西,我看到的所有示例都使用 EF 或 Nhibernate,或其他 ORM。
谢谢。
订单聚合根:
// Skipped most of properties
public class Order
{
public int OrderID { get; private set; }
public bool IsFinalized { get; private set; }
public List<OrderLine> OrderLines { get; private set; }
public void FinalizeOrder()
{
IsFinalized = true;
}
public void AddOrderLine(int stockItemID)
{
var orderLine = new OrderLine(0, OrderID, stockItemID);
OrderLines.Add(orderLine);
}
}
订单行汇总:
// Skipped most of properties
public class OrderLine
{
public OrderLine(int orderLineID, int orderID, int stockItemID)
{
OrderLineID = orderLineID;
OrderID = orderID;
StockItemID = stockItemID;
}
public int OrderLineID { get; private set; }
public int OrderID { get; private set; }
public int StockItemID { get; private set; }
}
OrderCommanHandler 和命令:
public class OrderCommandsHandler :
ICommandHandler<FinalizeOrderCommand>,
ICommandHandler<AddOrderLineCommand>
{
private readonly IOrderRepository orderRepository;
public OrderCommandsHandler(IOrderRepository orderRepository)
{
this.orderRepository = orderRepository;
}
public void Handle(AddOrderLineCommand command)
{
var order = orderRepository.FindByID(command.OrderID);
order.AddOrderLine(command.StockItemID);
orderRepository.Save(order);
}
public void Handle(FinalizeOrderCommand command)
{
var order = orderRepository.FindByID(command.OrderID);
order.FinalizeOrder();
orderRepository.Save(order);
}
}
public class AddOrderLineCommand : ICommand
{
public AddOrderLineCommand(int orderID, int stockItemID)
{
OrderID = orderID;
StockItemID = stockItemID;
}
public int OrderID { get; private set; }
public int StockItemID { get; private set; }
}
public class FinalizeOrderCommand : ICommand
{
public FinalizeOrderCommand(int orderID)
{
OrderID = orderID;
}
public int OrderID { get; private set; }
}
和 OrderRepository:
public class OrderRepository : IOrderRepository
{
public Order FindByID(int id)
{
// This is simple
throw new NotImplementedException();
}
public void Save(Order order)
{
// Help me implement
throw new NotImplementedException();
}
}
Is there any best practice to do it without using ORM? I really couldn't find anything, all example that i have seen are using EF or Nhibernate, or other ORMs.
这实际上与 CQRS、聚合或域驱动设计无关。只是"how do I save an object to a database"。我建议研究微型 ORM,例如 PetaPoco 或 Dapper。这些为您提供了一个非常轻量级的抽象来使用,并且有大量关于如何将对象保存到数据库的示例。它们有点介于使用 ADO.net 和成熟的 ORM(例如 nHibernate 或 EntityFramework)之间。