2014-01-21 3 views
0

Я пытаюсь получить инъекцию зависимостей Unity, работающую с сервисом WCF, который использует Entity Framework, но я смущаюсь об использовании контекста и репозитория.Использование инъекции зависимостей с использованием метода службы WCF и EF

Способ, которым я разработал его, состоит в том, чтобы иметь несколько классов репозитория, например UserRepository, MessageRepository, LocationRepository, каждый из которых принимает объект EF DbContext в качестве параметра конструктора. Это позволяет мне управлять Единицей работы на уровне контекста, вызывая context.Save() или rollback и т. Д. Для управления транзакциями через репозитории.

Путаница, в которой я нахожусь, заключается в том, что я не уверен, как представить это в зависимости от инъекции. Я хочу иметь два сценария:

a) Когда служба WCF создается через методы WCF, я хочу, чтобы он использовал класс DbContext, который я создал, и создать объекты репозитория, передав в созданном DbContext, который будет подключаться к База данных Entity Framework.

b) Когда методы службы WCF протестированы из отдельного тестового проекта, я хочу высмеять объекты репозитория, чтобы вернуть издеваемую информацию.

Если бы я просто использовал классы репозитория, это было бы относительно просто, как в каждом методе службы WCF, который я мог бы назвать Container.Resolve(), а затем я мог бы использовать фабрику Unity WCF для установки конкретных типов для создания экземпляра WCF и вручную настройте контейнер Unity в моем тестовом проекте для издевающихся типов.

Но сложность заключается в том, что моим репозиториям нужен класс DbContext для передачи в качестве параметра конструктора, который будет выходить за пределы срока существования репозитория, и мне также нужно иметь ссылку на него в моей службе методы, например

public bool CreateUser(DbUser user) 
{ 
    try 
    { 
     using (var context = new MyDbContext()) 
     { 
      var repository = new UserDataRepository(context); 

      user.GenerateUserLight(); 
      user.GenerateUserProfileLight(); 

      var result = repository.InsertItem(user); 
      repository.Save(); 

      return result; 
     } 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 

Как я могу адаптировать выше метод использовать Unity Dependency Injection, так что я могу дразнить его для тестового проекта?

ответ

0

Насколько я вижу, проблема заключается в том, что вы должны создавать свой контекст в своем репозитории, тот факт, что вы фактически обновляете контекст в службе, а затем передаете его в свой репозиторий, - это немного запах кода.

Почему бы не хранить репозитории DbContext? Таким образом, вы не связываете свои репозитории с Entity Framework в первую очередь.

Служба должна иметь только зависимость от интерфейса IUserRepository. Не конкретная реализация.

private readonly IUserRepository _userRepository; 

public MyService(IUserRepository userRepository) 
{ 
    this._userRepository = userRepository; 
} 
public bool CreateUser(DbUser user) 
{ 
    try 
    { 
      user.GenerateUserLight(); 
      user.GenerateUserProfileLight(); 

      var result = this._userRepository.InsertItem(user); 
      this._userRepository.Save(); 

      return result; 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 

Репозиторий пользователь должен принять DbContext в своем конструкторе, вам нужно будет зарегистрировать контекст с DI контейнера также так, что DI можно построить UserRepository, когда он вводится в службу.

public class UserRepository : IUserRepository 
{ 
    private readonly MyDbContext context; 

    public UserRepository(MyDbContext context) 
    { 
     this.context = context; 
    } 
} 

Тогда вы можете просто ввести «UserRepository» в службу через конструктор.

Это также позволит вам создавать типы репозитория Mock, которые вообще не нуждаются в контексте, просто создайте интерфейс для своего репозитория.

Смежные вопросы