2009-06-10 5 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 ..... 

    } 
} 

ответ

2

Не осуществляйте управление транзакциями в Репозитории. Вот почему вы запутались.

Дополнительная информация здесь: Transactions in the Repository Pattern

3

Это определенно не правильное использование паттерна репозитория. Я считаю, что самый простой способ подумать о репозитории - представить, что каждый Ордер в вашей системе доступен в большой коллекции (репозитории). Тем не менее, вы, вероятно, хотите добавить способ запроса определенных объектов из репозитория (либо с помощью шаблона запроса, либо с помощью прямых вызовов метода).

В нашей системе мы получили бы метод обслуживания слоя называется Checkout, который будет выглядеть следующим образом ...

 
    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 для идентификации заказов, но вы получите идею. ..

 Смежные вопросы

  • Нет связанных вопросов^_^