0

在服务层中公开 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 以外的其他实体,以便我可以在这个服务类中使用它们。如果您知道,对于需要选择多个表来获取数据的复杂查询。

但我不确定这是否是一个不好的做法!

任何帮助表示赞赏。谢谢。

4

2 回答 2

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 会在您引用导航属性时添加连接。

于 2011-08-07T03:36:16.077 回答
0

在 Web 应用程序中,每个请求只使用一个 DBContext 并在 BeginRequest 上创建它然后将其传递给请求中的所有调用并在 EndRequest 上处理它是很常见的。

请参阅此示例ASP.NET MVC 中的每个请求一个 DbContext(没有 IOC 容器)

于 2011-08-07T09:30:48.133 回答