Castle Windsor,流利的Nhibernate和Automapping Isession封闭式问题

时间:2010-12-29 14:15:53

标签: asp.net-mvc fluent-nhibernate castle-windsor automapping

我是整个城堡温莎,Nhibernate,流利和自动堆叠的新手,所以请原谅我的无知。我不想在此发布另一个问题,因为似乎已经有大量问题试图解决Windsor nhib Isession管理问题,但到目前为止他们都没有解决我的问题。当我尝试从我的存储库调用Db时,我仍然收到一个ISession已关闭的异常,这是我的容器设置代码。

container.AddFacility<FactorySupportFacility>()
            .Register(
                Component.For<ISessionFactory>()
                    .LifeStyle.Singleton
                    .UsingFactoryMethod(() => Fluently.Configure()
                                                  .Database(
                                                      MsSqlConfiguration.MsSql2005.
                                                          ConnectionString(
                                                              c => c.Database("DbSchema").Server("Server").Username("UserName").Password("password")))
                                                  .Mappings
                                                     (
                                                      m => 
                                                      m.AutoMappings.Add
                                                        (
                                                          AutoMap.AssemblyOf<Message>(cfg)
                                                          .Override<Client>(map =>
                                                          {
                                                              map.HasManyToMany(x => x.SICCodes).Table("SICRefDataToClient");
                                                          })
                                                          .IgnoreBase<BaseEntity>()
                                                          .Conventions.Add(DefaultCascade.SaveUpdate())
                                                          .Conventions.Add(new StringColumnLengthConvention(),new EnumConvention())
                                                          .Conventions.Add(new EnumConvention())

                                                          .Conventions.Add(DefaultLazy.Never())
                                                        )
                                                      )
                                                  .ExposeConfiguration(ConfigureValidator)
                                                  .ExposeConfiguration(BuildDatabase)
                                                  .BuildSessionFactory() as SessionFactoryImpl),
                 Component.For<ISession>().LifeStyle.PerWebRequest.UsingFactoryMethod(kernel => kernel.Resolve<ISessionFactory>().OpenSession()
                                                  ));

在我的存储库中,我注入private readonly ISession session;并将其用作跟随者

 public User GetUser(int id)
    {
        User u;

            u = session.Get<User>(id);
            if (u != null && u.Id > 0)
            { 
                NHibernateUtil.Initialize(u.UserDocuments);
            }


        return u;

<httpModules>内的web.config中。我也添加了这一行

      <add name="PerRequestLifestyle" 
type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor"/>

我仍然缺少这个难题的一部分,我无法相信这对于使用nHibernate和城堡Windsor进行任何Web应用程序开发的基本需求进行配置是如此复杂。

我一直在尝试按照这里的代码windsor-nhibernate-isession-mvc,我在那里发布了我的问题,因为他们似乎有完全相同的问题,但我的问题没有得到解决。

更新 MooKid8000我现在已经将我的城堡注册码更新为

private void AddRepositories()
    {
        container.Register(
            AllTypes.FromAssembly(typeof(MembershipRepository).Assembly)
                .Pick()
                .Configure(c => c.Interceptors(
                    InterceptorReference.ForKey("simpleLogger")).Anywhere
                )
                .Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
                .WithService.FirstInterface());
    }

但是我仍然认为ISession是封闭的问题,我的服务是否也需要注册为Transient,你能更详细地解释为什么它们应该是瞬态的而不是单身的

更新 MooKid8000建议是100%正确的,我只需要确保我的服务和存储库所有作为LifestyleType.Transient的范围,所以ISession没有被消灭。很棒的Mookid8000最初甚至没有看到我的城堡注册码。

对于任何有兴趣的人,请与我联系,我可以将您的容器设置发送给您。

1 个答案:

答案 0 :(得分:5)

您是否记得以短暂的生活方式注册您的存储库?

如果您的存储库是单例(这是Windsor的默认生活方式),则注入的ISession实例将被“捕获”,从而导致以后关闭的会话错误。

请注意,使用您的存储库的任何服务也必须具有短暂的生活方式,以及使用这些服务的任何服务,等等。

一般来说,你可以说生活方式的粒度不应该随着你离组合根越来越大而增加,否则就会出现某种范围。当然,这并不总是一个问题,但它可能导致很难诊断的错误。