2016-08-10 95 views
2

我有與其子的聚合根高階聚集訂單行,我想實現存儲庫模式,而無需使用ORM框架,只ADO.Net來,說我的大腦堆棧有點溢出的真相。我瞭解到應堅持秩序AggregateRoot不使用ORM

一種方法是使用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); 
    } 
} 

訂單行總結:

// 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

沒有「孩子聚集」這樣的事情。 – theDmi

+0

正確,並刪除單詞的孩子。 – QuietNaN

回答

1

有沒有做到這一點,而無需使用任何ORM的最佳實踐?我真的找不到任何東西,我見過的所有例子都使用EF或Nhibernate或其他ORM。

這實在與CQRS,Aggregates或Domain Driven Design無關。這只是「如何將對象保存到數據庫」。我建議研究微型ORM,例如PetaPoco或Dapper。這些爲你提供了一個非常輕量級的抽象,並且有很多關於如何將對象保存到數據庫的例子。他們在ADO.net和一個完整的ORM(如nHibernate或EntityFramework)之間有點不太合適。

+0

明白了,但我真的不想使用ORM,我只是想知道如何用ado.net以正確的方式做到這一點,當我不得不。謝謝 – QuietNaN

+0

爲什麼你不想使用微型ORM? – tomliversidge

+0

我知道如何在實踐中使用它們,但我不知道如何在沒有它們的情況下做這種持久性。這不是關於「我不想使用ORM」,而是關於「我也想知道如何在沒有它們的情況下做到這一點」。 – QuietNaN