存储库模式问题

时间:2009-06-10 21:25:16

标签: model-view-controller repository

我下面有两个存储库类, 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 个答案:

答案 0 :(得分: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来识别Orders,但是你明白了......

答案 1 :(得分:2)

不要在Repository中进行事务管理。这就是为什么你会感到困惑。

更多信息在这里: Transactions in the Repository Pattern