是否有可能让Ninject有条件地绑定范围?

时间:2011-03-18 15:46:47

标签: nhibernate asp.net-mvc-3 ninject

是否可以根据MVC操作属性有条件地解决正确的ISession 范围

Bind<ISession>().ToMethod(ctx => (ISession)NHibernateHelper.Open())
                .InRequestScope();

Bind<ISession>().ToMethod(ctx => (ISession)NHibernateHelper.Open())
                .InSessionScope();


可能解决方案的伪代码:

Bind<ISession>().ToMethod(...).InSessionScope()
                .WhenActionHasAttribute(LongConversation);

// else use this binding
Bind<ISession>().ToMethod(...).InRequestScope()

也许我的方法存在缺陷,我愿意为我的问题找到解决方案。

根据网络“对话”的类型,我需要保留NHibernateSession围绕HTTP请求/响应或HTTP会话。大多数会话仅持续一个HTTP请求/响应。

根据{{​​3}}

注意InSessionScope

2 个答案:

答案 0 :(得分:1)

直接从控制器访问会话无论如何都不是一个好的设计。在这种情况下,控制器正在做很多事情。

我宁愿实现不同的服务,这些服务会获得不同范围的NHilbernate并将它们注入您的控制器。这样,定义两个必需的绑定应该非常容易。例如,您可以向服务添加一个属性,该属性声明应注入哪个会话并在绑定中使用WhenClassHas。

答案 1 :(得分:1)

在每种情况下,你的答案都不正确。有理由你应该在控制器中进行ISession访问。即出于性能原因,直接查询控制器中的会话是有意义的。当控制器单一责任是显示某个客户为什么要直接调用ISession.Load(id)?其他一切都可能是不必要的抽象。