2015-01-13 2 views
0

Я пытаюсь сделать мой код работы с Injection Dependency, но у меня есть несколько проблем.Entity Framework dbContext находится слишком рано

У меня есть следующий код, который извлекает пользователя и связанные с ним роли.

public virtual User GetUser(string username,string password,evolutiondbEntities context, IUserRole userRoleRepository) 
     { 
      User systemUser = new User(); 
      using(context) 
      { 
       systemUser = (from u in context.Users where u.Username == username && u.UserPassword == password select u).FirstOrDefault(); 
       List<IUserRole> roleList = userRoleRepository.GetRoles(systemUser.UserID); 
       systemUser._roles = roleList; 
      } 

      return systemUser; 
     } 

Код для метода GetRoles выглядит следующим образом

public List<IUserRole> GetRoles(string userID,evolutiondbEntities context) 
     { 
      List<IUserRole> roleList = new List<IUserRole>(); 
      using(context) 
      { 
       roleList = (from r in context.UserRoles where r.UserID == userID select r).ToList<IUserRole>(); 
      } 

      return roleList; 
     } 

код выбирает пользователь правильно, но тогда, когда он называет GetRoles() метод появляется контекст утилизированы и поэтому, следовательно, не может ,

ПРИМЕЧАНИЕ: Я знаю, что я должен передавать интерфейс для контекста, но пока у меня пока что еще нет.

+2

Вы должны вставить контекст в свою службу и использовать его без блока 'using', как в конце блока' using', в котором находится контекст. –

+0

Могу ли я использовать блок-блок в точке инъекции? Я подумал, что рекомендуется использовать блок, так как он завершает работу после операций? – coolblue2000

+2

Контейнер ioc избавится от контекста, когда он подходит (в конце запроса) –

ответ

0

Вы должны ввести контекст в свою службу и использовать его без блока using, так как в конце using блокировка контекста расположена. Контейнер IoC отвечает за создание и удаление созданных объектов, как вы его инструктируете.

Таким образом, вы, как правило, имеют это:

IoC Регистрация:

container.For<Context>().Use<Context>(); 

И вам сервис:

public class SomeService : ISomeService 
{ 
    private readonly Context _context; 
    private readonly IUserRole _userRoleRepository; 
    public SomeService(Context context, IUserRole userRoleRepository) 
    { 
     _context = context; 
     _userRoleRepository = userRoleRepository; 
    } 

    public virtual User GetUser(string username, string password) 
    { 
     User systemUser = new User();   
     systemUser = (from u in _context.Users where u.Username == username && u.UserPassword == password select u).FirstOrDefault(); 
     List<IUserRole> roleList = _userRoleRepository.GetRoles(systemUser.UserID); 
     systemUser._roles = roleList;   

     return systemUser; 
    } 
} 
0

У меня была аналогичная проблема в прошлом, используя Ninject , Если вы не используете Ninject, то ваш IoC, скорее всего, будет иметь что-то подобное.

При привязке Ninjects для контекста мне пришлось использовать метод .InRequestScope().

kernel.Bind<EmployeeDbContext>().ToSelf().InRequestScope(); 
Смежные вопросы