2009-06-10 11 views
2

私は以下の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型のを使用していないが、あなたのアイデアを得ます。 ..