我有一个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。我的直觉告诉我,我不应该这样做。我的目标是编写尽可能少的代码来促进代码的可重用性,但我似乎仍然坚持使用相同的想法。
有人可以告诉我这是否是一种明智的方法,或者它是否有一些根本的缺点或维护费用?
欢迎任何替代解决方案。我对代码不感兴趣,只是一些想法。
谢谢
答案 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()),当需求发生变化时我必须更新。我认为这是一个维护开销,但我想不出任何替代解决方案。
希望这是有道理的。
谢谢