Использование MongoDB в качестве службы в ASP.NET Основной Блейзор

#c# #asp.net-core #blazor

#c# #asp.net-ядро #blazor

Вопрос:

Итак, у меня есть следующий MongoDBService, который я создал:

 public class MongoDBService
{
    private const String CONNECTION_STRING = "mongodb://localhost:27017";
    private const String DATABASE_NAME = "TestingTesting";
    private readonly MongoClient _Client;

    public MongoDBService()
    {
        _Client = new MongoClient(CONNECTION_STRING);
    }

    public IMongoCollection<T> GetCollection<T>()
    {
        return _Client.GetDatabase(DATABASE_NAME).GetCollection<T>(typeof(T).Name);
    }
}
  

Я установил MongoDBService в качестве службы в моем asp.net запуск ядра.cs:

 services.AddSingleton<MongoDBService>();
  

Затем я пытаюсь использовать сервис, вставив его на страницу .razor:

 @inject Project.Services.MongoDBService
  

Я также инициирую экземпляр моего MongoDBService:

 Project.Services.MongoDBService mongo = new Services.MongoDBService();
  

Но когда я затем пытаюсь его использовать, я получаю красную волнистую линию в методе FindAsync():

 async Task GetAllClocks()
{
    MongoDB.Driver.FilterDefinition<Project.Data.Clock> filter = MongoDB.Driver.Builders<Project.Data.Clock>.Filter.Empty;

    MongoDB.Driver.IMongoCollection<Project.Data.Clock> cursor = await mongo.GetCollection<Project.Data.Clock>().FindAsync(filter);
}
  

Ошибка:

CS0411: аргументы типа для метода ‘IMongoCollection.FindAsync(FilterDefinition, FindOptions<Clock, TProjection>, CancellationToken)’ не может быть выведен из использования. Попробуйте указать тип

Я некоторое время искал в Google, и хотя звучит так, будто я оставляю компилятору решать, какой тип использовать, я уверен, что я явно указываю Project.Data .Тип часов. Абсолютно в тупике. Есть идеи?

Комментарии:

1. Предположение: для FindOptions требуется два параметра типа, а вы предоставляете только один. Если вы хотите вернуть объект Clock, попробуйте FindOptions<Clock, Clock> .

2. Эй, Рикардо, ты на самом деле прав, я создал новый экземпляр FindOptions и передал его в качестве аргумента методу FindAsync. Странно то, что мне никогда раньше не приходилось этого делать, я впервые сталкиваюсь с этой ошибкой.

Ответ №1:

FindOptions требуется два параметра типа, а вы предоставляете только один. Если вы хотите вернуть Clock объект, попробуйте FindOptions<Clock, Clock> .

Комментарии:

1. Привет, Рикардо, спасибо за это. Есть идеи, почему в этом случае мне пришлось передать параметр FindOptions? Обычно filterdefintion<>.Empty достаточно для удовлетворения FindAsync()

2. На моей машине, использующей пакеты NuGet 2.11.2, мне не нужно передавать параметр FindOptions. Какую версию вы используете? Что у меня есть: клиент. getDatabase(«<db>»).getCollection<Clock>(«<коллекция>»). FindAsync(фильтр)

3. Мои MongoDB.Driver и MongoDB.Driver. Оба ядра тоже 2.11.2! Очень странно.