数据访问层 - 使用CRUD数据的会话

时间:2010-05-11 11:11:57

标签: session data-access-layer

我有一个DAL到CRUD的产品数据。

例如:

Order someOrder = new Order();
someOrder.Description = "Test";

someOrder.Save();
someOrder.Remove();

我需要设计DAL,以便只有锁定订单类型对象的用户才能执行CRUD操作。

我的想法是将会话传递给CRUD方法。一旦我通过了会话,该方法将检查该用户是否对该特定对象具有锁定,如果是,则继续执行该方法。

例如:

someOrder.Save(sessionThatContainsLockInformation);

// Pseudo-code
public void Save(Session session)
{

   1. Get user GUID from the session.
   2. Get lock details from the session.
   3. Check that the provided user has a lock.
   4. On success, proceed with saving the order.

}

我关心的是我在数据访问层使用Sessions。我的直觉告诉我,我不应该这样做。我的目标是编写尽可能少的代码来促进代码的可重用性,但我似乎仍然坚持使用相同的想法。

有人可以告诉我这是否是一种明智的方法,或者它是否有一些根本的缺点或维护费用?

欢迎任何替代解决方案。我对代码不感兴趣,只是一些想法。

谢谢

3 个答案:

答案 0 :(得分:1)

这只是一些想法,取决于您选择的持久性api。我相信Hibernate提供了一些“乐观/悲观锁定”机制。我不知道这些工作原理的确切细节,但你应该能够在hibernate主页上找到一些东西(如果你想使用hibernate)。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-locking

一个简单的(也许太简单,取决于手头的情况......)DIY方法可能是有一个简单的timestampChanged行。在写入DB时,您必须检查要保存的时间戳是否与数据库中的最后一个时间戳相同。但正如我所说,并非所有应用程序都适用于此......

希望这有帮助, 扬

答案 1 :(得分:1)

好的,谢谢你的澄清,我想我现在更明白了解你的担忧。

我前段时间遇到过类似的问题。我的解决方案是一个常见的超类(在您的类中,它将是Order,Item,Customer的超类),所有参数都相同(时间戳已更改,谁更改了等)。然后我创建了一个实用程序类,其中提到的所有检查都得到了处理。 所以这个“维护”逻辑只在一个地方实现。

我不是说这是最好的方法,它只是对我有用的东西......

希望这有帮助, 扬

答案 2 :(得分:0)

感谢您的回复。我的CRUD方法有效,我在那里没有任何问题。

我担心的是我会在很多方法中使用非常相似的签名和逻辑。例如,我有以下类:

订单 项目 客户

这些类中的每一个都有以下方法: 。保存() 卸下摆臂()

在每个方法的内部,我必须检查尝试运行该方法的用户是否有权这样做(对该对象有锁定)。为了做到这一点,我必须将用户详细信息和锁定详细信息传递给方法,因此我将最终得到以下内容:

Public void Save(UserAndLockDetails详细信息) {

}

现在图像我有50个类而不是3个,这意味着有100个方法(Save(),Remove()),当需求发生变化时我必须更新。我认为这是一个维护开销,但我想不出任何替代解决方案。

希望这是有道理的。

谢谢