2009-06-10 139 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的识别订单,但你的想法。 ..