Как параметризировать репозиторий базы данных?

Я только недавно познакомился с платформой .net и в первый раз вообще пишу веб апи как таковое, а на asp.net core c# тем более, так что заранее приношу извинения за крипоту.
В качестве бд я выбрал MongoDB, и при создании репозитория, пришла идея полностью параметризировать его, чтобы доступ к разным коллекциям осуществлялся посредством передачи в параметр соответствующих моделей. Вызываем _reposiroty.findOneAsync<UserModelDAO>() - репозиторий работает с коллекцией users, _reposiroty.findOneAsync<LectureModel>() будет работать с коллекцией lectures.

У меня есть реализованный класс MongoDatabase, который наследуется от абстрактного класса Database, и инкапсулированный обьект которого в контроллере приводится к родительскому типу.
public abstract class Database { 
    public abstract Task<TModel?> findOneAsync<TModel>(string key, string value);
    // some abstract methods
}


public class MongoDatabase : Database {
    // public override async Task<TModel?> findOneAsync<TModel>(string key, string value) {
    public override async Task<TModel?> findOneAsync<TModel>(string key, string value) where TModel : default {
        var collection = getCollection<TModel>();
        var filter = Builders<TModel>.Filter.Eq(key, value);
        TModel? res = await collection.Find(filter).SingleOrDefaultAsync();
        return res;
    }
    // ...
}


public class AuthController : ControllerBase {
    private Database _repository = new MongoDatabase();
    // ...
}


Проблема заключается в чем: при реализации абстрактного метода findOneAsync, который уж очень хочется сделать nullable, возникает ошибка компиляции, если не указать магическое where TModel : default. Также, проблема исчезает, если наследовать MongoDatabase не от абстрактного класса, а от интерфейса. Но так делать, если честно, не хочется, как то неправильно выглядит, но могу ошибаться. Почему так происходит?
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 1
NikFaraday
@NikFaraday
Student full-stack Developer
Лично мой совет:

Во первых, попробуйте сначала asp.net mvc, так как asp.net web api предлагается для тех программистов, которые имеют хотя бы 2 года коммерческого опыта.
Во вторых, для новичков рекомендуется использовать Entity Framework (Для MS SQL Server и SSMS)
Во трерьих, наследование от интерфейса (Правильно называется реализацией интерфейса, наследование только от классов) не создаст вам проблем, особенно если у вас в таком случае не возникает проблема компилляции (Какая именно?)
Во четвертых, реализация интерфейсов вам понадобится для так званого "Конвейера", который вы должны изучить на asp.net mvc
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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