在不使用ORM的情况下持久保存订单AggregateRoot

时间:2016-08-10 10:35:00

标签: c# repository persistence aggregateroot

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

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

OrderLine Aggregate:

    // 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();
    }
}

1 个答案:

答案 0 :(得分:1)

  

在没有使用ORM的情况下,有没有最好的做法?我真的找不到任何东西,我见过的所有例子都使用EF或Nhibernate或其他ORM。

这与CQRS,聚合或域驱动设计无关。它只是&#34;如何将对象保存到数据库&#34;。我建议研究微型ORM,如PetaPoco或Dapper。这些为您提供了一个非常轻量级的抽象,并提供了大量如何将对象保存到数据库的示例。他们在使用ADO.net和完整的ORM(如nHibernate或EntityFramework)之间有点中途。