您应该使用工厂方法注册 ISession。
另一种选择(并不总是最好的,但易于使用)是:
实现 ISession 和 ISessionFactory 接口(SessionProxy 和 SessionFactoryProxy)。
public class SessionAggregator : ISession {
protected ISession session;
public SessionAggregator(ISessionFactory theFactory) {
if (theFactory == null)
throw new ArgumentNullException("theFactory", "theFactory is null.");
Initialise(theFactory);
}
protected virtual void Initialise(ISessionFactory factory) {
session = factory.OpenSession();
}
// the ISession implementation - proxy calls to the underlying session
}
public class SessionFactoryAggregator : ISessionFactory {
protected static ISessionFactory factory;
private static locker = new object();
public SessionFactoryAggregator() {
if (factory == null) {
lock(locker) {
if (factory == null)
factory = BuildFactory();
}
}
}
// Implement the ISessionFactory and proxy calls to the factory
}
这样,您只需注册 ISession(由 SessionAggregator 实现)和 ISessionFactory(SessionFactoryAggregator),任何 DI 框架都可以轻松解析 ISession。
如果您的 DI 不支持工厂方法(我不知道 Structure Map 是否支持),这很好。
我已将这些实现添加到我的 Commons 程序集中,因此我不应该每次都重新实现它。
编辑:现在,要在 Web 应用程序中使用 ISession:
- 在结构映射中注册 SessionFactoryAggregator(生命周期可以是单例的)。
- 在 Snstrucure 映射中注册 SessionAggregator 并将其生命周期设置为 InstanceScope.Hybrid。
- 在每个请求结束时,您需要通过调用 HttpContextBuildPolicy.DisposeAndClearAll() 来处理会话
代码可能如下所示:
// The Registry in StructureMap
ForRequestedType<ISessionFactory>()
.CacheBy(InstanceScope.Singleton)
.TheDefaultIsConcreteType<SessionFactoryAggregator>();
ForRequestedType<ISession>()
.CacheBy(InstanceScope.Hybryd)
.TheDefaultIsConcreteType<SessionAggregator>();
// Then in EndRequest call
HttpContextBuildPolicy.DisposeAndClearAll()