我想我想得更好。
我刚刚创建了一个实现 NHibernate.ISession 的包装器,所以在我的方法中:
public NHibernate.ISession OpenDataSession(int userId)
{
return new SessionWrapper(SessionFactory.OpenSession(), userId, this);
}
这样,在我的监听器中,我只需对 SessionWrapper 进行类型转换并获取 UserId 属性。
到目前为止效果很好,我的包装器也实现了 IDisposable,所以应该没问题。
如果有人知道得更好,请告诉我。
更新:根据要求提供更多见解。
SessionWrapper 类定义:只需实现 NHibernate.ISession 并将所有方法重新映射到 WrappedSession(构造函数的第一个参数),如:
public DataStoreSessionWrapper(NHibernate.ISession wrappedSession, UserSession currentUser)
{
}
public NHibernate.EntityMode ActiveEntityMode
{
get { return WrappedSession.ActiveEntityMode; }
}
public NHibernate.ITransaction BeginTransaction(System.Data.IsolationLevel isolationLevel)
{
return WrappedSession.BeginTransaction(isolationLevel);
}
这个想法是,通过使用 Ninject,您可以将 NHibernate.ISession 绑定到这个包装器。虽然这假设 UserSession 对象也可以被容器访问,这是真的,因为 UserSession 可以存储在 Session 包中。
UPDATE2(随着我的发展:D):我有另一种方法,我认为这更好。
我没有包装器,而是有一个接口 IUserSessionStore,它基本上只有一个方法:返回 UserSession 对象的 GetUserSession()。这个接口在所有需要这个信息的类的构造函数中。
通过 Ninject,我简单地将这个接口映射到一个名为 UserSessionStore_ASPNETSession 的类,该类通过将对象存储到 ASPNET 会话包中来实现这一点。
显然,我假设这是一个网站,所有内容都在一个层中(不涉及远程处理或 wcf)。
我相信这实现起来更干净、更快捷,而且它还有益于可能需要此信息的所有其他层。
谢谢!