ASP.NET MVC 2,Nhibernate和跨层事务

3
我正在使用ASP.NET MVC 2、NHibernate和DDD创建一个解决方案。我正在使用半CQRS类型的模型。
ASP.NET控制器向服务层发送经过验证的消息,该层更新域对象的状态。我的域分派“事件”,然后由“事件处理程序”捕获并对其进行操作。每个事件处理程序都可以访问存储库层,并可以提交域对象状态。
事件处理程序还使用(非NHibernate)存储库直接插入记录到基于报告的表中。事件处理程序还可以执行非数据库相关的操作,例如发送电子邮件。
事件处理程序还可以更改对象的状态,从而创建新的一组事件。
我该如何确保在单个asp.net请求中发生的所有数据库操作都在一个事务内。 我已经阅读了一些博客(例如Kevin WilliamsMatt WrockDavy Brion),并获得了有关如何在Begin和End Request中启动Session对象的信息(再次使用Structure Map),但不确定事务是如何维护的。这加剧了开始和结束请求可能在不同线程上调用的事实。
我的Repository类以NHibernate ISession作为参数。如果我将ISession创建为混合范围(StructureMap),那么在请求期间通过StructrueMap传递的ISession参数是否保持不变。
请给予建议,也让我知道我的问题是否不清楚。

谢谢您,

Mar

The Mar

2个回答

1

您可以考虑为每个 Web 请求实现 工作单元模式。工作单元创建一个 NHibernate 会话并处理事务。您可以在网上找到几种实现,例如 thisthis


我接受了这个答案,因为这两个链接提供了很好的信息,可以开始处理我的UoW。 - TheMar

0

除了WorldIsRound的回答之外,您在描述中没有指定事务是在哪里创建和提交的(根据您的解释,我假设应该在服务层的某个地方)。
我知道有一些工具可以为您管理会话,也许还有您的事务,但我认为您应该明确控制您的事务。
我在我的项目中也使用UOW模式,在Begin_Request事件中创建一个Session对象,然后在需要时使用该对象创建事务。
再次强调,这只是我的意见,但我认为您应该完全控制打开和关闭事务的过程。
祝好运


谢谢。我希望在请求开始时创建事务,并在请求结束时提交事务。我还希望在操作执行开始时创建事务,并在操作执行结束时提交事务。这样,我就不需要为基于查询的数据库调用启动事务。 - TheMar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接