在 ASP.NET MVC3 中通过 Ninject DI 使用数据库事务

发布于 2024-11-25 09:38:36 字数 559 浏览 0 评论 0原文

我正在开始一个新项目,希望比以前做得更好。我用 Windsor 进行 DI 但效果不太好。我一直在考虑使用 NuGet Ninject MVC 3 包来处理 DI。

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

场景:

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

我的困惑/思考:

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

I'm starting a new project and want to do things better than I've done before. I used Windsor for DI but it didn't go great. I've been eyeing up using the NuGet Ninject MVC 3 package to take care of DI.

I've Googled around for many hours and found lots of helpful advice about Ninject (especially liking the filters DI stuff) but nothing that really answers the following burning scenario...

Scenario:

  • I have a SQL Server database for persistence. I want all access to the database to be in a transaction.
  • I'll be using repositories to access domain objects that are stored in the database.
  • A controller might need to use multiple repositories to do it's work and hence the data access needs to be the same instance based to each repository to avoid locking issues.
  • The data access should be per request made to web app.

My confusion/pondering:

  • If Ninject shoves in an appropriate DB factory or context to all my repositories then where (and how) would I put code to commit on successful completion or rollback if an exception occurs? Ideally you wouldn't want to do this for every controller action so I'm guessing in the global asax EndRequest event but how to know whether to commit or rollback.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不再见 2024-12-02 09:38:36

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

基本上,您可以在控制器方法上需要的地方添加事务属性 - 管道全部由 Sharp Arch 框架处理。

Check out Sharp Architecture's implementation of this - although they use Windsor, the same approach can be used with Ninject.

Basically you add Transaction attributes where required on Controller methods - the plumbing is all handled by the Sharp Arch framework.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文