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 .....

    }
}
4

2 回答 2

3

这绝对不是存储库模式的正确用法。我发现考虑存储库的最简单方法是想象系统中的每个订单都可以在一个大集合(存储库)中使用。也就是说,您可能想要添加一种方法来从存储库中查询特定对象(通过查询模式或直接方法调用)。

在我们的系统中,我们将有一个名为 Checkout 的服务层方法,它看起来像这样......

    公共无效结帐(int customerId)
    {
        if(CustomerHasOpenOrder(customerId) == false)
        {
           // 根据你的标准做一些事情。对我们来说,我们会
           // 抛出异常
        }

        订单 orderToCheckout = m_OrderRepository.FindOpenOrderForCustomer(customerId);

        orderToCheckout.Checkout();

        m_OrderRepository.Save(orderToCheckout);
    }

在我们的系统中,我们实际上并没有使用 int 来识别订单,但你明白了......

于 2009-06-10T21:38:56.703 回答
2

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

更多信息在这里: 存储库模式中的事务

于 2009-06-10T21:46:00.903 回答