В прошлых темах была рассмотрена работа с драйвером MongoDB для .NET в приложении на C#. Теперь рассмотрим, как мы можем взаимодействовать с MongoDB в рамках простейшего приложения ASP.NET.
Итак, создадим новый проект ASP.NET Core по типу ASP.NET Core Empty, который назовем MongoApp.
Для взаимодействия с сервером Mongo через пакетный менеджер Nuget установим пакет MongoDB.Driver:
Если используется .NET CLI, то для установки пакета применяется команда
dotnet add package MongoDB.Driver
Согласно документации MongoDB предпочтительно создавать один экземпляр MongoClient и использовать его внутри остальных частей приложения, к тому же MongoClient потокобезопасный. То есть по сути нам надо определить объект синглтон:
using MongoDB.Bson; using MongoDB.Driver; var builder = WebApplication.CreateBuilder(args); // определяем MongoClient как синглтон builder.Services.AddSingleton(new MongoClient("mongodb://localhost:27017")); var app = builder.Build(); app.MapGet("/", async (MongoClient client) => // получаем MongoClient через DI { var db = client.GetDatabase("test"); // обращаемся к базе данных var collection = db.GetCollection<BsonDocument>("users"); // получаем коллекцию users // для теста добавляем начальные данные, если коллекция пуста if (await collection.CountDocumentsAsync("{}") == 0) { await collection.InsertManyAsync(new List<BsonDocument> { new BsonDocument{ { "Name", "Tom" },{"Age", 22}}, new BsonDocument{ { "Name", "Bob" },{"Age", 42}} }); } var users = await collection.Find("{}").ToListAsync(); return users.ToJson(); // отправляем клиенту все документы из коллекции }); app.Run();
С помощью метода builder.Services.AddSingleton()
добавляем MongoClient в сервисы приложения, и затем мы можем получить данный сервис как и любой другой
через стандартный способы получения зависимостей в ASP.NET Core. В данном случае получаем MongoClient получаем через обработчик конечной точки. Затем внутри обработчика
уже можно обращаться к базе данных и ее коллекциям и производить операции с данными. Так, здесь для теста просто отправляем все документы из коллекции:
Но также стоит отметить, что согласно документации объект IMongoDatabase также потокобезопасный и может применяться как синглтон. Поэтому, если нам необходимо обращаться к одной и той же базе данных, то мы можем также определить объект IMongoDatabase как синглтон и передавать его через механизм DI в приложение:
using MongoDB.Bson; using MongoDB.Driver; var builder = WebApplication.CreateBuilder(args); // определяем IMongoDatabase как синглтон builder.Services.AddSingleton(new MongoClient("mongodb://localhost:27017").GetDatabase("test")); var app = builder.Build(); app.MapGet("/", async (IMongoDatabase db) => // получаем IMongoDatabase - базу данных "test" через DI { var collection = db.GetCollection<BsonDocument>("users"); // получаем коллекцию users // для теста добавляем начальные данные, если коллекция пуста if (await collection.CountDocumentsAsync("{}") == 0) { await collection.InsertManyAsync(new List<BsonDocument> { new BsonDocument{ { "Name", "Tom" },{"Age", 38}}, new BsonDocument{ { "Name", "Bob" },{"Age", 42}} }); } var users = await collection.Find("{}").ToListAsync(); return users.ToJson(); // отправляем клиенту все документы из коллекции }); app.Run();