【问题标题】:Custom ModelBinder Lifecycle and Dependency Injection [duplicate]自定义 ModelBinder 生命周期和依赖注入
【发布时间】:2012-10-09 02:35:48
【问题描述】:

可能重复:
Inject a dependency into a custom model binder and using InRequestScope using Ninject

我正在尝试将 NHibernate 会话绑定到自定义模型绑定器:

由于自定义模型绑定器似乎是单例,我认为我需要关注线程安全。这是我当前的 IoC 代码:

kernel.Bind<ISession>().ToProvider<SessionProvider>().InRequestScope()
    .OnActivation(x => ServiceModelBinder.Service = kernel.Get<IServiceService>());

在我的活页夹中,我使用ThreadStatic 属性修饰了静态服务字段,以避免会话的并发问题。

这是个好主意吗?

有没有更好的方法将每个请求范围的对象注入到视图模型中?还是我不应该担心它在纸上看起来有多难看,只需在需要的地方从DependencyResolver 获取当前会话?

【问题讨论】:

  • 另见该帖子的相关链接

标签: c# asp.net-mvc ninject modelbinders


【解决方案1】:

远离 ASP.NET 中的 ThreadStaticAttribute - 唯一正确的方法是将内容放在 HttpContext.Items 中,但在你去之前总是有很多更好的方法可以尝试 像这样低级的东西。

这里的关键问题是您正在使用一个错误的假设 - 模型绑定器在请求之间共享。

【讨论】:

  • "模型绑定器在请求之间共享。"这是我的假设,实际上。你能解释一下我的 actual 假设有什么问题吗?请求不一定由单个线程处理吗?
  • 无论如何,感谢您指出我的答案。解决方案要好得多,只是对于 IoC 新手来说有点令人困惑,因为它有点简单:)
  • @mootinator 请求的处理可以在线程之间移动。通常仅在执行异步操作时,但并非总是如此。老实说,您试图同时进行线程和请求范围界定的事实并没有让我清楚一点,您知道这两者都不是。我不清楚您将哪个假设称为关键假设。直到现在我才看到您在静态上使用 ThreadLocal。老实说,没有什么是错误的,只是一切都像厨房水槽一样......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多