2012-02-07 5 views
4

Помогают ли помощники в MVC3 в контроллере, а также в представлениях?Ясность о помощниках в MVC3?

Является ли помощником подходящее место для размещения общеупотребительных методов управления?

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

Благодаря

ответ

4

Вы могли бы реализовать базу Controller для этой логики. Помощники, или методы расширения, хороши для того, когда вы не хотите менять интерфейс для чего-то.

+0

Я тоже думал об этом, даже если он не используется на всех контроллерах? – Darren

+0

просто не выходят из него, если вам это не нужно. –

+0

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

2

HtmlHelper недоступен для контроллера, поскольку контроллер не должен нести ответственность за генерацию HTML, но UrlHelper доступен в контроллере.

Метод получения конкретных данных из вашей базы данных не относится к вашему контроллеру или в UrlHelper или HtmlHelper. Вы должны создать отдельный класс для этой логики, а затем вызвать метод в этом классе из своего контроллера. Если вы используете Dependency Injection, который я предлагаю, ваш контроллер код может выглядеть следующим образом:

public class MyController 
{ 
    IMyDataUtil _dataUtil; 
    public MyController(IMyDataUtil dataUtil) 
    { 
     _dataUtil = dataUtil; 
    } 

    public ActionResult SomeAction(int parentId) 
    { 
     var childIds = _dataUtil.GetChildIds(parentId); 
     ... 
    } 
} 

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

С другой стороны, если есть методы, которые могут быть использованы кучей разных контроллеров, инъекция этого же класса данных во все из них может стать громоздкой. В этом случае, вы можете:

  1. Продлить базовый класс, который имеет экземпляр класса доступа к данным вводимого в него через метод или инъекцию собственности, и который затем выставляет его на подклассы через защищенный или общественность property, или
  2. Создайте свой собственный класс-помощник, который обертывает классы и методы, которые вы, вероятно, будете использовать во всех ваших контроллерах, и вводите этот класс, чтобы у вас была только одна зависимость для множества общих функций, или
  3. Объединение этапы 1 и 2.
0

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

Это звучит как работа для ActionFilter.

1

Если под «хелперы» вы имеете в виду такие вещи, как HtmlHelper то, нет, они не используются контроллером как в теории вы могли бы принять ваши контроллеры и повторно использовать их с совершенно другой рендеринга (например, WPF), поскольку контроллер не отвечает за рендеринг.

Если вы говорите, как мне кажется, вспомогательные классы/методы, которые манипулируют вашими данными, готовыми для его ввода в модель с помощью контроллера, а затем передаются в представление для презентации, тогда вы можете рассмотрим слой «бизнес-логики». Например, если вы говорите (когда-либо типичный) пример банковского счета, вы могли бы иметь:

public class BankAccountService 
{ 
    public IEnumerable<string> GetAllAccountIdsForCustomer(int customerId) 
    { 
     // Talk to the database here and retrieve the account id's for a customer 
    } 
    public string GetCustomerName(int customerId) 
    { 
     // Talk to the database here and retrieve the customer's name 
    } 
} 

Ваш контроллер будет тогда:

public ActionResult AccountNumbers(int customerId) 
{ 
    var model = new AccountNumbersModel(); 
    model.CustomerId = customerId; 
    model.AccountNumbers = BankAccountService.GetAllAccountIdsForCustomer(customerId); 

    return View(model); 
} 

Очевидно, что в этом примере вы должны имеют класс, называемый AccountNumbersModel, и вы также, вероятно, захотите рассмотреть возможность использования Dependency Injection, чтобы предоставить вашему контроллеру экземпляр BankAccountService, но описывая, как обойти все, что не входит в рамки этого ответа.

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

+0

И в основном я ввел логику в модель, как и другие среды MVC? – Darren

+0

Нет, модель должна быть свободной от логики (IMO), вы используете свой бизнес-уровень/службу, чтобы выполнить работу «получить все дочерние дочерние элементы в базе данных» и передать результат модели, чтобы представление могло отображать ее. Это немного сложно понять, не зная немного больше о том, что вы делаете =) – Rob

+0

Извините за путаницу. В основном у меня есть раскрывающийся список, который я заполняю всеми субпользователями текущего пользователя. Субпользователи определяются через таблицу «многие-ко-многим». Поэтому мне нужно получить все идентификаторы в этой таблице, у которых есть родительский идентификатор пользователя. Обычно в других рамках я имею это как модельный метод, однако в MVC3 он кажется теоретически другим. – Darren

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