StructureMap: CacheBy (InstanceScope.Singleton) вопрос - PullRequest
1 голос
/ 24 декабря 2009

У меня есть вопрос о том, как работает InstanceScope.Singleton, потому что я получаю некоторые неожиданные результаты:

У меня есть служба, которая зависит от Дао

public MetaProjectService(IMetaProjectDao metaProjectDao)
        {
            _metaProjectDao = metaProjectDao;

        }

и у меня есть Дао, которое зависит от 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. Он не будет работать с последующими запросами, так как он будет содержать ссылку на сборку экземпляра IMetaProject в первом запросе. Есть и другие зависимости, которые я пропустил для ясности. Таким образом, вопрос заключается в том, как мне создать IMetaProjectDao для каждого запроса и сделать так, чтобы IMetaProjectService ссылался на этот новый экземпляр при одновременном использовании IMetaProjectService в качестве одиночного.

1 Ответ

1 голос
/ 26 декабря 2009

От чтения вашего кода и понимания NHibernate все становится работает точно так, как ожидалось.

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

Будет вызываться только один раз, если вы кешируете IMetaProjectDao как синглтон, который абсолютно то, что вы НЕ ХОТИТЕ. Синглтон экземпляр ISession из NHibernate является самым большим анти-паттерном, который вы может реализовать (если это не WinForms, которые я сомневаюсь от вашего использования GetCurrentSession ()). Вы должны кэшировать свой Дао в гибридном или HybridSession в зависимости от того, реализуете ли вы сеанс запрос или длинные сессии.

...