将NHibernate从2.1升级到3.0时,CommonServiceLocator中缺少ISessionFactoryKeyProvider

时间:2011-06-10 12:45:21

标签: nhibernate model-view-controller spring.net sharp-architecture

我有一个ASP.NET MVC应用程序,它使用Spring.NET 1.2进行依赖注入,使用NHibernate 2.1进行ORM。它一直在MVC 3上运行,在一个稍微修改过的版本中使用S#arp架构,我们一直在编译,我现在正在努力摆脱它。 (即我将开始使用引用的SharpArch .dll而不是纯源代码。)

使用从here获取的提示以及使用找到的here SpringServiceLocatorAdapter完成Spring的初始化。 NH使用SharpArch的NHibernateSession.Init初始化,它给出了我们的两个汇编路径。映射是使用HBM XML文件完成的。

转移到NH 3的决定引发了一个严重的DLL地狱案例,因此我当然不得不更新FluentNH,NH Validator,SharpArch,Spring和Castle Windsor二进制文件。为了使工作变得有效,需要更改引用并进行少量代码修复。这一切都是预期的。

现在我已经让软件运行良好,Spring已初始化并且DI正确完成。但是当存储库尝试使用它的Session对象时,我收到以下错误。

  

创建名为''的对象时出错:   没有类型的服务   'SharpArch.NHibernate.ISessionFactoryKeyProvider'   定义

我一直试图在一天中的最佳时刻找出原因。 在我看来,SpringServiceLocatorAdapter已经过时,但我找不到有关它的信息。此外,只需删除它的使用会导致存储库的Sessions为null,从而导致NullReferenceExceptions。但据我所知,这个问题也可能就像NH初始化一样。

希望有人可以指出我正确的方向。我很难过,因为我不是那个开始设置系统的人,很难找到版本升级的重大变化列表。

非常感谢!如果需要,我当然会提供更多信息。

1 个答案:

答案 0 :(得分:1)

你需要用spring注册一个ISessionFactoryKeyProvider的实现,默认实现是DefaultSessionFactoryKeyProvider,在windsor中,语句看起来像这样:

        container.Register(
                Component.For(typeof(ISessionFactoryKeyProvider))
                    .ImplementedBy(typeof(DefaultSessionFactoryKeyProvider))
                    .Named("sessionFactoryKeyProvider"));