2013-11-06 2 views
2

Если у меня есть модель, которая работает непосредственно с моей базой данных (Лично с использованием ASP.NET w \ Entity Framework), следует ли использовать конструктор для установки переменной?«Правильный» MVC - Должен ли я использовать конструктор или нет?

Пример:

public class songs 
{ 
    public IEnumerable<songs> allSongs {get; } 

    public songs() 
    { 
     using (var context = new entities()) 
     { 
      allSongs = context.songs.orderBy(n => n.name).toList(); 
     } 
    } 
} 

В.С.

public class songs 
{ 
    public IEnumerable<songs> allSongs 
    { 
     get 
     { 
      using (var context = new entities()) 
      { 
       allSongs = context.songs.orderBy(n => n.name).toList(); 
      } 
     } 
    } 

    public songs() {} 
} 

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

ответ

2

Вы не должны получать доступ к данным из класса домена.

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

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

Второй подход лучше всего подходит для работы с репозиториями.

Пример компоновки:

public class SongController : Controller { 
private SongRepository _songRepository; 

public SongController(SongRepository repo) { 
    _songRepository = repo; 
} 

public ActionResult ShowSongs(){ 
    return View(_songRepository.GetAllSongs()); 
} 
} 

public class SongRepository { 
public IEnumerable<Song> GetAllSongs(){ 
    using (var context = new entities()) 
     { 
      allSongs = context.songs.orderBy(n => n.name).toList(); 
     } 
} 
} 
+0

Не уверен, что я понимаю, что вы имеете в виду для класса домена. Можете ли вы предоставить ссылку, чтобы помочь мне понять, почему мой пример не соответствует лучшим практикам? Выше приведен пример. Хотел бы я действительно сделать репозиторий каждый раз, когда мне нужно работать с данными. Как сказал @Stijn ниже, я не всегда собираюсь копировать каждый элемент в базе данных. – DR913

+0

@ DR913: Вы должны вводить ваш репозиторий с помощью инструмента, такого как 'ninject', который будет содержать только один репозиторий, который используется повсюду. Я напишу свой ответ через 3-4 часа после того, как вернусь с лекции (и если к тому времени никто этого не сделает) –

0

Что делать, если вы только хотите, чтобы получить 1 песню? Я уверен, что вы не хотите загружать все песни тогда.

Если я могу добавить, вы должны посмотреть вокруг существующих проектов или tutorials, чтобы посмотреть, как это можно сделать. Обратите внимание, что я говорю может, что вы будете читать отнюдь не способ сделать это. Например, @JeroenVannevel рекомендует шаблон репозитория, но есть много людей, которые рекомендуют против него (при работе с EF).

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

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