我对InstanceScope.Singleton的工作原理有疑问,因为我在这里得到了一些意想不到的结果:
我有一项依赖于Dao的服务
public MetaProjectService(IMetaProjectDao metaProjectDao)
{
_metaProjectDao = metaProjectDao;
}
我有Dao依赖于ISession(Nhibernate)
public MetaProjectDao(ISession nhSession)
: base(nhSession)
{}
对于结构图我有以下内容:
ForRequestedType<IMetaProjectService>()
.TheDefaultIsConcreteType<MetaProjectService>();
//.CacheBy(InstanceScope.Singleton);
ForRequestedType<IMetaProjectDao>()
//.TheDefaultIsConcreteType<MetaProjectDao>()
//.CacheBy(InstanceScope.Singleton)
.TheDefault
.Is.ConstructedBy(() =>
{
var session = ObjectFactory
.GetNamedInstance<ISessionFactory>(
MetaProjectDao.SESSION_FACTORY_NAME)
.GetCurrentSession();
return new MetaProjectDao(session);
});
问题:如果我将IMetaProjectService的定义取消注释为缓存为InstanceScope.Singleton,它将不会对后续请求起作用,因为它仍然会在第一个请求时保留对IMetaProject实例构建的引用。为清楚起见,还省略了其他依赖项。所以问题是如何在每个请求上构建IMetaProjectDao并让IMetaProjectService在将IMetaProjectService作为单例时引用这个新实例。
答案 0 :(得分:1)
从阅读代码和了解NHibernate一切都是 完全按预期工作。
var session = ObjectFactory
.GetNamedInstance<ISessionFactory>(MetaProjectDao.SESSION_FACTORY_NAME)
.GetCurrentSession();
如果将IMetaProjectDao缓存为,则只会调用一次 单身,这绝对是你不想要的。一个单身人士 来自NHibernate的ISession实例是你最大的反模式 可以实现(除非这是WinForms我怀疑你的用法 GetCurrentSession())。您应该将您的Dao缓存在Hybrid或 HybridSession取决于您是否正在实施会话 请求或长时间会话。