Когда использовать Singleton по сравнению с Переходным процессом по сравнению с использованием Запроса Ninject и MongoDB

Я не совсем уверен, когда я должен использовать SingletonScope () по сравнению с TransientScope () по сравнению с RequestScope (), когда я делаю свою привязку в моем global.cs файле.

У меня есть, например, свой вызов к MongoSession (использующий NoRM и mvcStarter http://mvcstarter.codeplex.com/ проекта), который установлен на SingletonScope, но я создал репозиторий, которые используют этот объект MongoSession выполнить вызовы к легче монго, например, у меня есть NewsRepository, который использует MongoSession для выборки моих Сообщений печати от данных. Как пример у меня есть вызов, который выбирает Сообщения печати, которому установили DisplayOnHome на истинный, и получите последнее CreationDate. Такой репозиторий должен быть SingletonScope или был бы RequestScope быть более соответствующим?

Когда я должен использовать каждый из него и почему?

21
задан Ruben Bartelink 27 July 2010 в 21:44
поделиться

2 ответа

Как правило, в веб-приложении вы хотите, чтобы состояние было как можно большей областью запроса.

Только в случае очень низкоуровневой оптимизации вы, вероятно, столкнетесь с ситуацией, когда уместно создать одноэлементные объекты (и даже в этом случае есть вероятность, что вы перенесете такую ​​логику кэширования / совместного использования в другой класс, который втягивается как зависимость от других ваших объектов [область запроса] и делает эту одноэлементной областью).Помните, что синглтон в контексте веб-приложения означает несколько потоков, использующих одни и те же объекты. Это редко бывает хорошими новостями.

Исходя из этого, переходная область видимости является наиболее очевидным вариантом по умолчанию (и именно поэтому Ninject 2 делает это так) - область запроса должна входить в уравнение только тогда, когда что-то необходимо совместно использовать по соображениям производительности и т. Д. (Или потому что это просто контекст обмена [как указано в другом ответе]).

21
ответ дан 29 November 2019 в 21:44
поделиться

Думаю, ответ будет зависеть от того, представляет ли ваш MongoSession единицу работы или нет. Большинство классов, связанных с базами данных, с которыми я работал (в основном в контексте ORM, например NHibernate или EF4), вращаются вокруг контекста, сущностей и отслеживаемого состояния, которые представляют собой единицу работы . Единица работы никогда не должна храниться дольше времени, необходимого для выполнения данной единицы работы, по истечении которого эта единица должна быть зафиксирована или откатана. Это означает, что вам следует использовать RequestScope .

Если ваш MongoSession является не единицей работы, вы можете оставить его на протяжении всего сеанса MVC, и в этом случае SessionScope будет тогда быть подходящим.

3
ответ дан 29 November 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: