2016-06-13 8 views
0

Я пытаюсь узнать, как использовать Injection Dependency для автоматического монтирования в веб-приложении MVC 5. В то время как я нашел учебные пособия «Инъекция зависимостей» и «Единство», примеры, которые я видел, скорее всего приветствуют мировое разнообразие и никогда не сталкиваются с проблемой контекстов базы данных в контроллерах.Инъекция зависимостей DbContext без репозитория

Чтобы дать вам лучший пример того, что я имею в виду, вот фрагмент кода того, что у меня есть и что я пытаюсь сделать.

Когда я использую Visual Studio для автоматической подстройки контроллера «с представлениями, используя Entity Framework», обычно это создается.

public class TideUploadsController : Controller 
    { 
     // This is the EF Database context placed by the auto-scaffolder 
     private AzMeritContext db = new AzMeritContext(); 

     [HttpGet] 
     public ActionResult Index() 
     {    
      return View(db.TideUploads.ToList()); 
     } 

     /* further CRUD ActionResults not shown */ 

    } 
} 

Из того, что я читал до сих пор, чтобы использовать Dependency Injection, я должен использовать конструктор, который вызывает интерфейс вместо класса. Я прочитал смешанные обзоры об упаковке репозитория вокруг Entity Framework. Я хотел бы посмотреть, могу ли я сделать это без использования репозитория.

Есть ли уже существующий интерфейс, который я должен использовать вместо DbContext, который помещается в код авто-scaffolder?

// This is the EF Database context placed by the auto-scaffolder 
    private AzMeritContext db = new AzMeritContext(); 

    public TideUploadsController(/* what Interface goes here? */) 
    { 
     //db = ? 
    } 

Или это ситуация, когда мне действительно нужно, чтобы обернуть вокруг хранилища Entity Framework DbContext?

Я провел последние несколько недель, чтение книг и поиск через учебники и видео, и я еще не видел, шаг за шагом пример, который показывает что-то вроде:

  • Шаг 1: Возьмите контроллер что вы просто автошлифовали
  • Шаг 2: Сделайте это ...
  • Шаг n: Теперь ваш контроллер слабо связан с контекстом базы данных, а не с плотно соединенным.

ответ

1

Ну, для меня одна из преимуществ за инъекциями зависимостей является то, что вы в основном развязкой вашей «зависимости» в mockable объектов или другие реализации, ИМХО хранилище шаблона является общим способом пойти, я не вижу другой альтернативой использования обертки и настройки интерфейса и реализации в вашем контейнере.

Я думаю, вы знакомы с понятием:

public class UserRepository:IUserRepository 
{ 
    public UserRepository(){ 
    // you usually instanciate your context here 
    // private AzMeritContext db = new AzMeritContext(); 
    } 
    User GetUserById(int Id){ 
    // do your query to get a single user 
    } 
} 

это implementation выглядит нормально для меня.

тогда ваш контроллер должен выглядеть следующим образом:

public class TideUploadsController : Controller 
     { 

      public TideUploadsController(IUserRepository userRepository){ 
       // constructor injection 
       // assign your user repository to a local variable outside of the constructor scope something like _userRepository 
      } 

      [HttpGet] 
      public ActionResult Index() 
      {    
       return View(_userRepository.GetUserById(1)); 
       // let's assume your variable's name is _userRepository 
      } 

      /* further CRUD ActionResults not shown */ 

     } 
    } 

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

мои два цента , Надеюсь, это поможет.

+0

Для всех аргументов для репозиториев один недостаток, который я все еще вижу, - это много дополнительного ввода текста. Хотя я нашел примеры общего интерфейса репозитория, я еще не видел общий репозиторий, чтобы я мог вставить любую конструкторскую пару context & model в конструктор и использовать одни и те же глаголы (get, insert и т. Д.). Есть ли у вас какие-либо идеи относительно действительно общего хранилища? –

+0

, вероятно, вам следует создать «общий репозиторий» и выполнить инъекцию DBContext в конструкторе, эта идея кажется мне удобной http://blog.gauffin.org/2013/01/repository-pattern-done-right/ и as вы говорите, что есть много кода для записи и ввода для переноса любого доступа к базе данных –

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