首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用ORM的持久化顺序AggregateRoot

不使用ORM的持久化顺序AggregateRoot
EN

Stack Overflow用户
提问于 2016-08-10 10:34:59
回答 1查看 202关注 0票数 3

我有一个聚合根顺序和它的子聚合OrderLine,我试图实现存储库模式,而不使用ORM框架,只使用ADO.Net,并且说实话,我的大脑堆栈有点溢出。

我学到的一种方法是使用百忧解,它的思想是记录聚合根中的事件,而不是使用它们将更改保存到数据库中。现在,我试图避免在事件中使用Projac,并希望实现存储库,它将检测AggregateRoot中的更改并将其保存到数据库中。在不使用ORM的情况下,有什么最佳做法可以做到吗?我真的找不到任何东西,我看到的所有例子都是使用EF、Nhibernate或其他or。

谢谢。

顺序聚合根:

代码语言:javascript
复制
    // 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聚合:

代码语言:javascript
复制
    // 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和命令:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
    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();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-10 19:14:13

在不使用ORM的情况下,有什么最佳做法可以做到吗?我真的找不到任何东西,我看到的所有例子都是使用EF、Nhibernate或其他or。

这实际上与CQRS、Aggregates或领域驱动设计无关。它只是“如何将对象保存到数据库”。我建议您研究一下微型or,如PetaPoco或Dapper。这为您提供了一个非常轻量级的抽象,并提供了大量如何将对象保存到数据库中的示例。他们是一个介于与ADO.net和成熟的ORM (如nHibernate或EntityFramework )之间的中途之家。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38870971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档