Я только недавно познакомился с платформой .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 не от абстрактного класса, а от интерфейса. Но так делать, если честно, не хочется, как то неправильно выглядит, но могу ошибаться. Почему так происходит?