Подтвердить что ты не робот

Каков правильный способ управления соединениями MongoDB в ASP.Net MVC?

Какова наилучшая практика для управления жизненным циклом класса MongoServer? Должен ли я создать его и закрыть его в конце каждого запроса или он должен храниться в виде сингла на всю жизнь приложения, используя что-то вроде StructureMap?

Любая помощь ценится.

4b9b3361

Ответ 1

В официальная документация указано, что MongoServer, MongoDatabase и MongoCollection являются потокобезопасными и что вы" Предполагается создать один MongoServer для каждой базы данных, к которой вы подключаетесь.

Таким образом, MongoServer, MongoDatabase и MongoCollection можно безопасно настроить как одиночные. MongoServer даже поможет принудительно выполнить это, возвращая тот же экземпляр MongoDatabase для последовательных вызовов, а MongoDatabase сделает то же самое для MongoCollection s.

т.е. ваш экземпляр MongoServer может быть надежно настроен на использование образа oneton в вашем контейнере IoC, и вы также можете настроить инъекцию для MongoDatabase и, возможно, даже MongoCollection.

Я использую эту стратегию самостоятельно с Виндзором - здесь вы можете увидеть мой MongoInstaller: https://gist.github.com/2427676 - он позволяет моим классам просто продолжайте и делайте это:

public class SomeClass
{
    public SomeClass(MongoCollection<Person> people)
    { ... }
}

чтобы иметь инъецированную коллекцию, красивую и готовую к использованию.

Ответ 2

Драйвер С# автоматически управляет подключениями к серверу (он использует пул соединений). Нет необходимости звонить на сервер. Подключитесь, когда драйвер подключается автоматически. Не вызывайте server.Disconnect, поскольку это закрывает все подключения в пуле соединений и препятствует эффективному объединению пулов.

Что касается управления жизненным циклом экземпляра MongoServer, вы можете хранить его в статической переменной и использовать его для жизни вашего процесса (и делиться им по потокам, это поточно-безопасный). Кроме того, вы можете просто вызвать MongoServer.Create снова, когда вам нужно получить экземпляр сервера. Пока вы продолжаете называть MongoServer.Create с той же строкой соединения, вы будете продолжать возвращать тот же экземпляр MongoServer.

Ответ 3

Внедрить его с помощью любого контейнера IOC (structuremap, Windsor и т.д.) и сохранить его время жизни на основе запроса.