【问题标题】:Configure Castle Windsor Container and Nhibernate using Nhibernate Facility使用 Nhibernate Facility 配置 Castle Windsor Container 和 Nhibernate
【发布时间】:2011-06-27 09:24:32
【问题描述】:

我正在尝试使用 Nhibernate Facility 配置带有 Castle Windsor Container 的 Nhibernate。但我有

这是我的 web.config

<castle>
    <facilities>
      <facility id="nhibernate" 
                type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, Castle.Facilities.NHibernateIntegration"                
                isWeb="true">
        <factory id="nhibernate.factory">
          <settings>
            <item key="connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
            <item key="connection.driver_class">NHibernate.Driver.SqlClientDriver</item>
            <item key="connection.connection_string">Data Source=184.106.114.146\calyx;Initial Catalog=ClaimBook;User ID=system;Password=Manager1!;Persist Security Info=True;Max Pool Size=120;Connection Lifetime=120;</item>
            <item key="dialect">NHibernate.Dialect.MsSql2000Dialect</item>
            <item key="show_sql">true</item>
            <item key="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</item>
          </settings>
          <resources>            
            <resource assembly="Astute.Framework.Data" />
          </resources>
        </factory>
      </facility>
    </facilities>
  </castle>

在我的 global.asax 中,我添加了以下几行

container.Kernel.Register(Component.For<ISessionManager>().ImplementedBy<DefaultSessionManager>().Named("nhfacility.sessionmanager"));
            container.Kernel.Register(Component.For<ISessionFactoryResolver>().ImplementedBy<SessionFactoryResolver>().Named("nhfacility.sessionfactory.resolver"));
            container.Kernel.Register(Component.For<ISessionStore>().ImplementedBy<WebSessionStore>().Named("nhfacility.sessionstore"));
            container.Kernel.Register(Component.For<ITransactionManager>().ImplementedBy<DefaultTransactionManager>().Named("nhibernate.transaction.manager"));

但我收到以下错误

*没有为指定别名映射 ISessionFactory 组件:nh.facility.default 堆栈跟踪: [FacilityException:没有为指定的别名映射 ISessionFactory 组件:nh.facility.default] Castle.Facilities.NHibernateIntegration.Internal.SessionFactoryResolver.GetSessionFactory(字符串别名)+147 Castle.Facilities.NHibernateIntegration.DefaultSessionManager.CreateSession(字符串别名)+65 Castle.Facilities.NHibernateIntegration.DefaultSessionManager.OpenSession(字符串别名)+150 Castle.Facilities.NHibernateIntegration.DefaultSessionManager.OpenSession() +37 Castle.Facilities.NHibernateIntegration.Components.Web.SessionWebModule.OnBeginRequest(对象发送者,EventArgs e)+124 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75*

我不知道我在配置中缺少什么。有什么想法吗?

谢谢

伊姆兰

【问题讨论】:

  • 你为什么要手动注册 ISessionManager 等?该设施负责处理。
  • 我也很惊讶为什么我需要手动注册。它应该由设施处理。可能是我缺少一些配置。我已按照此 URL stw.castleproject.org/%28S%28ta5wga45q0nwdif0d3vk0saf%29%29/… 中描述的步骤进行操作。我确定我在 Global.asax 中做错了什么。有什么想法吗?
  • 您知道如何注册 nhibernate 工具吗?我没有得到任何例子。
  • wiki 中没有任何地方说您必须手动注册 ISessionManager
  • 但是如果你查看下面的 URL castleproject.org/container/facilities/trunk/nhibernate/… 它说要使用 NHibernate 工具,你只需要注册它并提供配置。如果你想使用集成级别 2 的方法,你可以让你的数据访问组件需要 ISessionManager。

标签: nhibernate castle-windsor ioc-container castle windsor-nhfacility


【解决方案1】:

ISessionManagerISessionFactoryResolver 等是由 NHibernate 设施管理的组件。您不应该手动注册它们。

您可以通过执行以下操作从该 web.config 安装该工具:

container.Install(Configuration.FromAppConfig());

有关详细信息,请参阅reference docs about Configuration installers

【讨论】:

  • 非常感谢您的帮助。我在我的 global.asax 中添加了上面的行,但我仍然收到错误 ISessionFactory 组件未映射到指定的别名:我的 global.asax 中的 nh.facility.default 我有 container = new WindsorContainer(); container.Install(Configuration.FromAppConfig());我已经删除了所有手动注册的 ISessionManager。现在我没有因为好的错误而出错。但我仍然面临这个 nh.facility.default 错误。任何想法。我真的很感谢你的帮助。谢谢
  • 以下是 SessionFactoryResolver 类中抛出此异常的函数。 public ISessionFactory GetSessionFactory(String alias) { String componentKey = alias2Key[alias] as String; if (componentKey == null) { throw new FacilityException("一个 ISessionFactory 组件是" + "没有映射到指定的别名:" + 别名); } return kernel.Resolve(componentKey); }
  • 啊..最后我解决了这个问题。我在 web.config 中以错误的方式提供映射程序集。谢谢你帮助毛里西奥
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多