StructureMap:CacheBy(InstanceScope.Singleton)问题

时间:2009-12-24 16:15:05

标签: nhibernate structuremap

我对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作为单例时引用这个新实例。

1 个答案:

答案 0 :(得分:1)

从阅读代码和了解NHibernate一切都是 完全按预期工作。

var session = ObjectFactory
    .GetNamedInstance<ISessionFactory>(MetaProjectDao.SESSION_FACTORY_NAME)
    .GetCurrentSession();

如果将IMetaProjectDao缓存为,则只会调用一次 单身,这绝对是你不想要的。一个单身人士 来自NHibernate的ISession实例是你最大的反模式 可以实现(除非这是WinForms我怀疑你的用法 GetCurrentSession())。您应该将您的Dao缓存在Hybrid或 HybridSession取决于您是否正在实施会话 请求或长时间会话。