我对整个温莎城堡、Nhibernate、Fluent 和 Automapping 堆栈都是新手,所以请原谅我的无知。我不想就此发布另一个问题,因为似乎已经有大量问题试图解决 Windsor nhib Isession 管理问题,但到目前为止,他们都没有解决我的问题。当我尝试从我的存储库调用 Db 时,我仍然收到 ISession is closed 异常,这是我的容器设置代码。
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;
在我的 web.config 里面<httpModules>
。我也添加了这一行
<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 最初甚至没有看到我的城堡注册码。
对于任何有兴趣的人,请与我联系,我可以将我的容器设置发送给您。