我做一个项目只是为了学习,我在那里创建了 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 将借用上下文。这将意味着以下内容:
c 选项
using也可以,只是你最好不要使用构造函数,而是使用上下文工厂之类的东西 - 否则你将无法将任何依赖项传递给上下文。您可以使用 来代替上下文工厂,IServiceScopeFactory但最好不要这样做,因为无类型的工厂IServiceScopeFactory隐藏了上下文对服务敏感的事实,而不是其他东西。