gpt4 book ai didi

asp.net-mvc - CaSTLe Windsor、Fluent Nhibernate 和 Automapping Isession 已关闭问题

转载 作者:行者123 更新时间:2023-12-02 11:33:13 24 4
gpt4 key购买 nike

我对整个温莎城堡、Nhibernate、Fluent 和 Automapping 堆栈都是新手,所以请原谅我的无知。我不想就此发布另一个问题,因为似乎已经有大量问题试图解决 Windsor nhib Isession 管理问题,但到目前为止,没有一个问题能解决我的问题。当我尝试从存储库调用数据库时,我仍然收到 ISession is close 异常,这是我的容器设置代码。

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()
));

在我的存储库中我注入(inject) 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;

在我的web.config里面<httpModules> 。我还添加了这一行

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

我仍然缺少这个难题的一部分,我不敢相信这是一个如此复杂的事情,需要配置 nHibernate 和 caSTLe 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 ,您能否更详细地解释为什么它们应该是 transient 的而不是单例的

更新MooKid8000的建议是100%正确的,我只需要确保我的服务和存储库的范围都为LifestyleType.Transient,这样ISession就不会被清除。很棒的地方 Mookid8000,最初甚至没有看到我的城堡注册码。

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

最佳答案

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

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

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

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

关于asp.net-mvc - CaSTLe Windsor、Fluent Nhibernate 和 Automapping Isession 已关闭问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4554848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com