Asp.net mvc EF4.1 DbContext和服务层

时间:2011-08-07 03:06:11

标签: asp.net-mvc-3 entity-framework-4 service-layer dbcontext

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

但我不确定这是不是很糟糕!

感谢任何帮助。感谢。

2 个答案:

答案 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)