【问题标题】:Using database transactions in ASP.NET MVC3 with Ninject DI在带有 Ninject DI 的 ASP.NET MVC3 中使用数据库事务
【发布时间】:2011-07-20 14:05:44
【问题描述】:

我正在开始一个新项目,并希望将事情做得比以前更好。我将温莎用于 DI,但效果并不好。我一直在关注使用 NuGet Ninject MVC 3 包来处理 DI。

我在 Google 上搜索了好几个小时,发现了很多关于 Ninject 的有用建议(特别是喜欢过滤器 DI 的东西),但没有任何东西能真正回答以下燃烧场景......

场景:

  • 我有一个用于持久性的 SQL Server 数据库。我希望对数据库的所有访问都在一个事务中。
  • 我将使用存储库来访问存储在数据库中的域对象。
  • 控制器可能需要使用多个存储库来完成它的工作,因此数据访问需要基于每个存储库的相同实例以避免锁定问题。
  • 应根据对 Web 应用程序的请求进行数据访问。

我的困惑/思考:

  • 如果 Ninject 将适当的数据库工厂或上下文推送到我的所有存储库,那么如果发生异常,我应该在哪里(以及如何)将代码提交成功完成或回滚?理想情况下,您不希望对每个控制器操作都执行此操作,因此我猜测全局 asax EndRequest 事件,但如何知道是提交还是回滚。

【问题讨论】:

    标签: asp.net-mvc-3 ninject data-access-layer


    【解决方案1】:

    查看 Sharp Architecture 对此的实现 - 尽管他们使用 Windsor,但 Ninject 也可以使用相同的方法。

    基本上,您可以在 Controller 方法所需的位置添加 Transaction 属性 - 管道全部由 Sharp Arch 框架处理。

    【讨论】:

    • 从阅读 Sharp Architecture 的几个页面后,听起来我必须安装一大堆 3rd 方库,使用 NHibernate 并使用 Sharp Architecture 只是为了使用 Transaction 属性 - 看起来像大量的矫枉过正,因为它提到的唯一一个我可能使用的第 3 方库是 NUnit。
    • 同意——我无意向你推荐这种方法——只是为了展示一种可行的建筑实践。显然,您需要编写自己的上述属性实现。
    • 噢!当然,大声笑;得到了源代码,看起来应该相当简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2014-06-21
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多