不使用 ORM 持久化 Order AggregateRoot

Persisting Order AggregateRoot Without Using ORM

我有一个聚合根 Order 及其子聚合 OrderLine,我试图在不使用 ORM 框架的情况下实现存储库模式,仅 ADO.Net,说实话,我的大脑堆栈有点溢出。

我学到的一种方法是使用 Projac,它的想法是在聚合根中记录事件,然后使用它们将更改保存到数据库。现在我试图避免将 Projacevents 一起使用,并希望实现将检测 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)之间。