【问题标题】:Asp.net mvc EF4.1 DbContext and Service LayerAsp.net mvc EF4.1 DbContext 和服务层
【发布时间】:2011-08-07 03:06:11
【问题描述】:

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

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

感谢任何帮助。谢谢。

【问题讨论】:

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


    【解决方案1】:

    我看到的一个问题是您使用的是通用存储库。它可以用于简单的情况,但正如你所说,如果你需要加入这种方法是行不通的。因此,一项改进是创建特定的存储库

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

    【讨论】:

    • 谢谢。我知道你提到的两种方法。但我个人不喜欢第二种方法,说实话,我喜欢使用 Context 对象。我对此感到安全。:D 其次,目前此服务可能会与这两个存储库一起解决。但在未来,这项服务可能需要更多的存储库。那么我将不得不再次将它们添加到构造函数中。
    • 关于你的第一个方法我更喜欢它。您是否知道任何开源示例应用程序可以帮助我更好地理解这一点。
    • @Nazmoon 抱歉,我不记得任何样品。但结构将取决于您的域
    【解决方案2】:

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

    见这个例子One DbContext per request in ASP.NET MVC (without IOC container)

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 1970-01-01
      • 2011-02-15
      • 2014-02-25
      • 1970-01-01
      • 2011-09-18
      • 2012-01-10
      • 2011-10-10
      • 1970-01-01
      相关资源
      最近更新 更多