Вопрос о репозитории - PullRequest
       25

Вопрос о репозитории

2 голосов
/ 11 июня 2009

У меня есть два класса репозитория ниже, Класс 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 ]

3 голосов
/ 11 июня 2009

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

В нашей системе у нас был бы метод уровня обслуживания, называемый 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);
    }

В нашей системе мы на самом деле не используем целые числа для идентификации заказов, но вы поняли ...

2 голосов
/ 11 июня 2009

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

Больше информации здесь: Транзакции в шаблоне репозитория

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...