2013-09-18 4 views
0

Я бы попросил также о лучших методах и шаблонах для asp.net MVC, используя этот пример:MVC шаблоны и практика

У меня есть проект. Это его архитектура:

  1. Модели
  2. Controler
  3. Просмотров
  4. Инструменты

В модели папки у меня есть каждый ViewModel в отдельном поле класса. Все объявления таблиц (объекты) я помещаю в один файл (AccountModels.cs или ForumModels.cs). У меня есть отдельный файл для контекста EF (MyAppContext.cs).

Контролер - здесь у меня есть только классы-контроллеры. Но, может быть, часть кода будет лучше пример и предложение, что я могу улучшить:

private AppContext db = new AppContext(); 

[HttpPost] 
[Authorize] 
public ActionResult AddGun(GunModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     Gun gunToAdd = new Gun 
     { 
      Tilte = model.Tilte, 
      AuthorID = UserTools.getUser(User.Identity.Name).UserId, 
      AddDate = DateTime.UtcNow, 
      Content = model.Content, 
      CategoryID = model.CategoryID, 
      CategoryName = GunsTools.getCategoryName(model.CategoryID) 

     }; 

     db.Guns.Add(gunToAdd); 
     db.SaveChanges(); 

     return RedirectToAction("Details", new { ID = gunToAdd.ID }); 

    } 

return RedirectToAction("Index"); 

} 

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

Просмотров - Просмотров в отдельной папке, для Частичный вид I установить специальный префикс (например - _NavigationPartial.cshtml или _CalculatorPartial.cshtml). Есть ли что-то для улучшения здесь? Конечно, Views использует ViewModels, а не модели.

И не менее - Инструменты. Я поставил здесь несколько классов и методов, чтобы предотвратить повторение кода. Вот несколько методов, которые witch возвращает из базы данных некоторые объекты или просто строки, такие как GetUser (..) или GetCategoryName (..). Это хорошая практика?

Я думаю, что многие молодые разработчики MVC имеют одинаковую архитектуру проекта (я лично видел это в нескольких компаниях), и многие из них, возможно, также хотят улучшить что-то в своих проектах, чтобы стать лучшими программистами.

С уважением

+0

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

+0

Спасибо за ответ. У меня возникла проблема в том, как задавать конкретные проблемы или практики, поэтому я подумал, что покажу пример моего приложения MVC. Я не знаю шаблонов и практик, поэтому не знаю, что я должен спросить. – whoah

ответ

1

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


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

Вместо этого вы должны иметь отдельный слой данных, который абстрагируется от деталей, что такое юридическое лицо Пушки (с точки зрения базы данных) и то, что пистолет Модель (с точки зрения вида)

случайно выбранный, но хороший SO вопрос об этом можно найти here


  • Вы могли бы рассмотреть с помощью Dependency INJ прогиб (DI) для контроллера

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

readonly AppContext _db; 
public GunController(AppContext db) 
{ 
    if (db==null) {throw new ArgumentNullException("db is null");} 
    _db=db; 
} 

Вам нужно использовать DI контейнер для этого вверх. Случайно выбранный (но на самом деле хорошо) статью можно найти here


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

+0

Спасибо за ответ. 'У вас должен быть отдельный слой данных '- .. где я буду делать все операции над моделями? Я прав? Является ли это хорошим примером использования этого шаблона? [Нажмите здесь] (http://programmers.stackexchange.com/a/135751/102204). Должен ли я также использовать некоторые «контейнеры DI»? Который лучший? Как я понимаю, на примере выше все, что мне нужно - отдельный слой данных и DI, да? Так много вопросов, но после прочтения вашего поста я лучше понимаю это. Еще раз спасибо. С уважением! – whoah

+0

@whoah, да, это довольно хороший пример. Вам не нужно сначала использовать DI, но в долгосрочной перспективе это поможет. Я бы рекомендовал сначала отсортировать ваши слои, а затем очистится, как использовать DI, чтобы помочь вам разделить их. Лично я считаю, что NInject отлично подходит для DI, но вы должны проверить некоторые из них, они могут нажать на вас :) –

+0

Lovely! Большое спасибо еще раз :) Хорошо, так что сначала я попробую только с DAL (уровни приложений данных - это собственное имя?) Для моего сервиса buissnes без DI - это хорошая идея? Затем я добавлю его в свои контроллеры - и вот мой вопрос. В моем контроллере я буду использовать inferface, например 'ILibraryService _libraryService; '(я думаю, это для DI) или, может быть, просто' LibraryService _LibraryService; '(я думаю, что это правильно :)). И когда хороший момент для начала использования DI с уровнями данных? Или, может быть, я что-то путаю? С уважением! :) – whoah

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