Делаю проект просто с целью обучения, там создал класс CommentService, в котором содержатся методы для работы с БД (с целью сократить код в будущем):
public class CommentService : IDatabaseService<Comment>
{
private readonly ILogger<CommentService> _logger;
private readonly DatabaseContext _db;
public CommentService(ILogger<CommentService> logger, DatabaseContext context)
{
_logger = logger;
_db = context;
}
public async void AddEntity(Comment entity)
{
_db.Comments.Add(entity);
await _db.SaveChangesAsync();
}
public async Task<List<Comment>> GetAllEntitiesAsync()
{
return await _db.Comments.ToListAsync();
}
public async Task<List<Comment>> GetAllCommentsByPostId(int postId)
{
return await _db.Comments.Where(p => p.PostId == postId).ToListAsync();
}
public async Task<Comment> GetEntityByIdAsync(int id)
{
return await _db.Comments.FindAsync(id);
}
public async void RemoveEntityById(int id)
{
_db.Comments.Remove(await GetEntityByIdAsync(id));
await _db.SaveChangesAsync();
}
public void Dispose()
{
_db.Dispose();
}
}
Вопрос состоит в следующем: будет ли правильным такой подход? Имею в виду передачу через конструктор контекста БД из другого класса сюда, а затем вызова Dispose? Или лучше в каждом методе использовать using(DatabaseContext _db = new DatabaseContext())
?
Как я понимаю, и то, и другое подразумевает Dispose, и он нужен, чтобы можно было работать с контекстом в разных классах и чтобы не было конфликтов, но что более правильно и нужно ли вообще?
Зависит от архитектуры вашего приложения.
В показанном вами варианте ваш CommentService владеет контекстом. Это означает следующее:
В то же время, вы можете просто убрать вызов Dispose. В таком случае, ваш CommentService будет заимствовать контекст. Это будет означать следующее:
Вариант с using
тоже будет работать, только вам лучше использовать не конструктор, а что-нибудь вроде фабрики контекстов - иначе вы не сможете передать в контекст никаких зависимостей. Вместо фабрики контекстов можно использовать IServiceScopeFactory
, но лучше так не делать, поскольку нетипизированная IServiceScopeFactory
скрывает тот факт, что сервису нежен именно контекст, а не что-то ещё.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Объясните мне, а то не врублюсь, как будет быстрее и лучше, и почему:
Хочу сформировать модель таким образом что б при возвращение на клиент я обращался через точку и свойство а не через номер в массивеПример