在服务层中公开DbContext是不好的做法吗?
例如:
private readonly IRepository<SkillLevels> _repository;
private readonly IDatabaseFactory _databaseFactory;
private readonly IUnitOfWork _unitOfWork;
public SkillLevelService(IRepository<SkillLevels> repository, IDatabaseFactory databaseFactory, IUnitOfWork unitOfWork)
{
_repository = repository;
_databaseFactory = databaseFactory;
_unitOfWork = unitOfWork;
}
public void InsertSkillLevel(SkillLevels entity)
{
_repository.Insert(entity);
_unitOfWork.Commit();
}
这里,IDatabaseFactory可以返回我的DbContext对象。我在这里公开它是因为如果我需要除SkillLevels之外的其他实体,那么我可以在这个服务类中使用它们。如果您知道,对于复杂查询,当您需要选择多个表来获取数据时。
但我不确定这是不是很糟糕!
感谢任何帮助。感谢。
答案 0 :(得分:0)
我看到的一个问题是您使用的是通用存储库。它可以用于简单的情况,但正如你所说,如果你需要加入这种方法是行不通的。因此,一个改进就是创建特定的回购
public interface ISkillLevelsRepository : IRepository<SkillLevels>
{
//have specific methods to achieve what you want
}
另一种方法是在服务类中使用多个存储库并删除Factory
。
private readonly IRepository<SkillLevels> _skillsRepository;
private readonly IRepository<Student> _studentRepository;
private readonly IUnitOfWork _unitOfWork;
public SkillLevelService(IRepository<SkillLevels> skillsRepository, IRepository<Student> studentRepository, IUnitOfWork unitOfWork)
{
_skillsRepository= skillsRepository;
_studentRepository = studentRepository;
_unitOfWork = unitOfWork;
}
然后访问多个回购以实现您的需求。
如果您已经使用所有导航字段正确定义了模型,则可能很少需要进行连接,因为EF会在您引用导航属性时添加连接。
答案 1 :(得分:0)
在Web应用程序中,每个请求只使用一个DBContext并在BeginRequest上创建它然后将其传递给请求中的所有调用并将其部署在EndRequest上。
请参阅此示例One DbContext per request in ASP.NET MVC (without IOC container)