2009-06-10 230 views
2

我有兩個存儲庫類, MoneyTransferRepository類被我的項目中的其他類使用。我是這樣設計的 - 是不是?如果不是,最好的方法是什麼?存儲庫模式問題

感謝

public interface IMoneyTransferRepository 
{ 
    void UpdateBalance(); 
} 

public interface IOrderRepository 
{ 
    void Checkout(); 
    void SaveOrder(); 
} 

public class MoneyTransferRepository : IMoneyTransferRepository 
{ 
    DBDataContext DB; 

    public MoneyTransferRepository(IDbConnection connection) 
    { 
     DB = new DBDataContext(connection); 
    } 

    public void UpdateBalance() 
    { 
     //do something DB.Table1.Update 
    } 

} 


public class OrderRepository : IOrderRepository,IMoneyTransferRepository 
{ 

    DBDataContext DB; 
    IMoneyTransferRepository moneyTransferRepository; 

    public OrderRepository() 
    { 
     DB = new DBDataContext(); 
     moneyTransferRepository = new MoneyTransferRepository(DB.Connection); 
    } 

    public void Checkout() 
    { 
     TransactionOptions transactionOptions = new TransactionOptions(); 
     transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; 

     using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) 
     { 
      try 
      { 
       UpdateBalance(); 
       SaveOrder(); 
       transactionScope.Complete(); 
      } 
      catch 
      { 

      } 

     } 
    } 

    public void UpdateBalance() 
    { 
     moneyTransferRepository.UpdateBalance(); 
    } 

    public void SaveOrder() 
    { 
     //do something DB.SaveOrder.Update ...... 
     // DB.Updatestock ..... 

    } 
} 

回答

3

,這是最絕對不是存儲庫模式的正確用法。我發現想想存儲庫的最簡單方法是想象系統中的每個Order都可以在一個大集合(存儲庫)中使用。也就是說,您可能想要添加一種方法從存儲庫中查詢特定對象(通過查詢模式或直接方法調用)。

在我們的系統,我們將有一個服務層方法叫結賬,將這個樣子......

 
    public void Checkout(int customerId) 
    { 
     if(CustomerHasOpenOrder(customerId) == false) 
     { 
      // do something depending on your standards. For us we'd 
      // throw an exception 
     } 

     Order orderToCheckout = m_OrderRepository.FindOpenOrderForCustomer(customerId); 

     orderToCheckout.Checkout(); 

     m_OrderRepository.Save(orderToCheckout); 
    } 

在我們的系統,我們實際上並不使用int的識別訂單,但你的想法。 ..