Asp.net MVC EF4.1 DbContext и уровень обслуживания - PullRequest
0 голосов
/ 07 августа 2011

Является ли плохой практикой выставлять 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 голосов
/ 07 августа 2011

В веб-приложении довольно часто просто использовать один DBContext для запроса и создавать его в BeginRequest, затем передавать его всем вызовам в запросе и размещать его в EndRequest.

См. Этот пример Один DbContext на запрос в ASP.NET MVC (без контейнера IOC)

0 голосов
/ 07 августа 2011

Одна проблема, которую я вижу, это то, что вы используете общий репозиторий. Он может работать для простых случаев, но, как вы сказали, если вам нужно присоединиться, этот подход не сработает. Таким образом, одним из улучшений было бы создание определенных репо

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 добавит объединения при обращении к навигационным свойствам.

...