我有一个聚合根订单及其子聚合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();
}
}
答案 0 :(得分:1)
在没有使用ORM的情况下,有没有最好的做法?我真的找不到任何东西,我见过的所有例子都使用EF或Nhibernate或其他ORM。
这与CQRS,聚合或域驱动设计无关。它只是&#34;如何将对象保存到数据库&#34;。我建议研究微型ORM,如PetaPoco或Dapper。这些为您提供了一个非常轻量级的抽象,并提供了大量如何将对象保存到数据库的示例。他们在使用ADO.net和完整的ORM(如nHibernate或EntityFramework)之间有点中途。